Я создал два приложения MVC с одинаковой аутентификацией. В приложениях я использую разные роли пользователей, которые можно назначить каждому пользователю. Когда я вхожу в систему как администратор, все работает нормально, я вхожу в первое приложение, и тот же файл cookie используется для входа во второе приложение, никаких запросов на вход не требуется.

Когда я вхожу в систему как пользователь с другой назначенной им ролью, экран входа в систему снова появляется после входа в первое приложение и не исчезает, даже если я тоже вхожу туда.

Оба приложения находятся на одном сервере IIS. Машинный ключ настроен правильно на сервере IIS (очевидно, поскольку он работает, если я вхожу в систему как пользователь с назначенной ролью администратора), и вот код в Startup.Auth.cs для обоих приложений:

1-е приложение:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    CookieName = "DefaultCookie",
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

2-е приложение:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    CookieName = "DefaultCookie",
    AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("./Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),
        OnApplyRedirect = ApplyRedirect
    },
});

private static void ApplyRedirect(CookieApplyRedirectContext context)
{
    Uri absoluteUri;
    if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri))
    {
        var path = PathString.FromUriComponent(absoluteUri);
        Trace.WriteLine(path);
        if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath)
            context.RedirectUri = "/Account/Login" +
                new QueryString(
                    context.Options.ReturnUrlParameter,
                    context.Request.Uri.AbsoluteUri);
    }
    context.Response.Redirect(context.RedirectUri);
}

Кто-нибудь знает, почему это происходит и что я могу сделать, чтобы это исправить?

2
A. Savva 3 Июл 2017 в 15:14

1 ответ

Лучший ответ

Это проблема авторизации, а не аутентификации. Если вы можете поделиться логином вообще , то есть в случае вашего администратора, то с этим все в порядке. Однако роль пользователя должна быть авторизована для доступа к контроллеру / действию, иначе они все равно будут перенаправлены на страницу входа, даже если они уже аутентифицированы. Это предназначено для них как возможность повторно аутентифицироваться с учетной записью с соответствующими привилегиями, поскольку тот, который они использовали, очевидно, не имеет доступа.

Короче говоря, вам необходимо убедиться, что любой контроллер (-ы) / действие (-а), к которому вы хотите, чтобы пользователь мог получить доступ, разрешал назначенную им роль.

3
Chris Pratt 3 Июл 2017 в 17:33
У меня перед контроллером стоит строка [Authorize]. Вы имеете в виду, что я должен конкретно указать, какие роли разрешены? Я думал, что все роли авторизованы, если не указано иное.
 – 
A. Savva
3 Июл 2017 в 18:03
1
Ты прав. Однако поведение вашего приложения предполагает, что где-то уже есть ограничение ролей. Возможно, был применен глобальный атрибут авторизации, или, возможно, определенные действия имеют атрибут авторизации с примененными ролями.
 – 
Chris Pratt
3 Июл 2017 в 18:08
Да ты был прав! Я пропустил [Authorize(Roles = "Administrator")] в первом приложении, которое не позволяло другим ролям пользователей открывать веб-сайт. Спасибо!
 – 
A. Savva
3 Июл 2017 в 18:40