ASP.NET MVC - 两个应用程序之间的相同身份验证

时间:2017-07-03 12:14:03

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

我创建了两个共享相同身份验证的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);
}

有谁知道为什么会这样,以及我可以做些什么来解决它?

1 个答案:

答案 0 :(得分:3)

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

很长一段时间,您需要确保您希望用户能够访问的任何控制器/操作允许分配给它们的角色。