繁体   English   中英

如何设置自定义身份验证Cookie?

[英]How to set custom authentication cookies?

我正在构建一个使用我们自己的数据模型,另一个ORM,其他业务逻辑等的自定义ASP.NET Identity 2.0实现。默认情况下,通过设置ApplicationCookie可以登录用户,之后AuthorizeAttribute识别cookie和日志用户登录。对于我们自己的实现,我想添加更多登录方式。例如:

  • 模拟
  • 密码重置令牌
  • Google身份验证器(两因素)
  • 短信(两因素)

在所有这些情况下,用户都必须登录, 但是允许用户执行什么操作取决于他的登录方式。例如:当用户使用“密码重置令牌”登录时,他可以更改密码,但什么也别做。 当用户使用“用户名+密码”登录时,他基本上可以执行所有操作,除了需要更高权限级别的操作(其中有两个因素的方法)。 为此,我想构建一个自定义AuthorizeAttribute ,以检查使用了哪种登录方法,然后确定用户是否可以执行该操作。

我面临的问题是我可以设置ApplicationCookie以外的其他cookie(例如,通过SMS进程设置的TwoFactorCookie ),但是这些cookie无法识别为身份验证cookie。 因此,当我具有TwoFactorCookie ,无法使用该Cookie进行登录。只有具有ApplicationCookie才能登录。

我正在努力解决的问题:

  • 我是否总是需要使用ApplicationCookie登录还是可以使用自定义Cookie进行登录(例如,可以使用ApplicationCookieTwoFactorCookieXYZCookie
  • 对于每种身份验证方法,我应该使用不同的cookie还是应该仅使用1个cookie,并以不同的方式存储身份验证方法/类型(例如,在Claim中)?
  • 如果我应该使用不同的cookie,是否还应该为每种身份验证方法/类型编写自定义身份验证中间件,还是可以使用默认的CookieAuthenticationMiddleware 据我所知,唯一要做的就是设置一个cookie,并使用正确的身份验证方法对其进行标记,以便我可以看到用户的登录方式。

编辑:

根据郝公的建议,我提出了几种扩展方法,如下所示:

public static void UseSmsSignInCookie(this IAppBuilder app, TimeSpan expires)
{
    if (app == null)
        throw new ArgumentNullException("app");

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = ApplicationAuthenticationTypes.Sms,
        AuthenticationMode = AuthenticationMode.Passive,
        CookieName = CookiePrefix + ApplicationAuthenticationTypes.Sms,
        ExpireTimeSpan = expires,
    });
}

我尝试通过使用具有我的自定义AuthenticationType(SMS)的自定义ClaimsIdentity调用AuthenticationManager.SignIn来登录某人。 但是,这不起作用:调用SignIn之后, HttpContext.Current.User.Identity.AuthenticationType的结果仍等于ApplicationCookie cookie已按预期设置。

有人知道我想念的东西吗?

因此,每个CookieMiddleware实例基本上代表一个auth cookie,如果您想要多个cookie,则可以添加多个cookieMiddleware并检索到cookie的ClaimsIdentity映射,您只需要在AuthenticationManager上调用Authenticate并将AuthenticationType传递给您想要的Cookie。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM