【问题标题】:ASP.NET MVC - Same authentication between two applicationsASP.NET MVC - 两个应用程序之间的相同身份验证
【发布时间】:2017-12-06 16:58:39
【问题描述】:

我创建了两个共享相同身份验证的MVC 应用程序。在应用程序中,我使用可以分配给每个用户的不同用户角色。当我以管理员身份登录时,一切正常,我登录到第一个应用程序并使用相同的 cookie 登录到第二个应用程序,不涉及登录提示。

当我以分配给他们的不同角色的用户身份登录时,登录屏幕会在登录到第一个应用程序后再次弹出并且它不会消失,即使我也在那里登录。

应用程序都在同一个IIS 服务器上。机器密钥在IIS 服务器中配置正确(显然,如果我以分配了管理员角色的用户身份登录,它就可以工作),这是Startup.Auth.cs 中两个应用程序的代码:

第一次申请:

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))
    }
});

第二次申请:

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);
}

有谁知道为什么会发生这种情况以及我可以做些什么来解决它?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 iis


    【解决方案1】:

    这是一个授权问题,而不是身份验证问题。如果您可以共享登录完全,即对于您的管理员用户,那么这方面的一切都很好。但是,必须授权用户的角色访问控制器/操作,否则即使他们已经通过身份验证,他们仍将被重定向到登录页面。这是为了让他们有机会使用具有适当权限的帐户重新进行身份验证,因为他们使用的帐户显然没有访问权限。

    简而言之,您需要确保您希望用户能够访问的任何控制器/操作都允许分配给他们的角色。

    【讨论】:

    • 我在controller前面有[Authorize]这一行,你的意思是我应该具体说一下哪些角色是授权的?我认为它的工作原理是,除非另有说明,否则所有角色都被授权。
    • 你是对的。但是,您的应用程序的行为表明某处已经存在角色限制。也许,已应用了全局 Authorize 属性,或者特定操作具有应用了角色的 Authorize 属性。
    • 是的,你是对的!我在第一个阻止任何其他用户角色打开网站的应用程序中错过了[Authorize(Roles = "Administrator")]。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2018-01-28
    • 2011-01-31
    • 1970-01-01
    • 2015-08-01
    • 2019-06-30
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多