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

时间:2014-10-30 21:44:41

标签: asp.net authentication cookies identity asp.net-identity-2

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

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

在所有这些情况下,用户必须登录,允许用户执行的操作取决于他登录的方式。例如:当用户使用&#登录时39;密码重置令牌',他可能会更改他的密码但不做任何其他事情。当用户使用'用户名+密码'登录时,除了需要更高权限级别的操作(双因素方法发挥作用)之外,他基本上可以完成所有操作。为了做到这一点,我想构建一个自定义AuthorizeAttribute来检查使用的登录方法,然后决定用户是否可以执行操作。

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

我遇到的问题:

  • 我是否始终需要使用ApplicationCookie登录,或者我是否也可以使用自定义Cookie登录(例如,我可以使用ApplicationCookieTwoFactorCookie和{ {1}}?
  • 我是否应该为每种身份验证方法使用不同的Cookie,或者我应该只有1个cookie并以不同的方式存储身份验证方法/类型(例如在声明中)?
  • 如果我应该使用不同的cookie,我是否还应为每种身份验证方法/类型编写自定义身份验证中间件,还是可以使用默认的XYZCookie?据我所知,唯一需要做的就是设置一个cookie,并用正确的身份验证方法标记它,这样我就可以看到用户是如何登录的。

修改

根据Hao Kung的建议,我做了几个扩展方法,如下所示:

CookieAuthenticationMiddleware

我尝试使用具有自定义身份验证类型(SMS)的自定义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, }); } 调用AuthenticationManager.SignIn来记录某人。但这并不起作用:在调用SignIn之后,ClaimsIdentity的结果仍然等于HttpContext.Current.User.Identity.AuthenticationType。该cookie已按预期设置。

有没有人知道我错过了什么?

1 个答案:

答案 0 :(得分:1)

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