ASP.NET标识和自定义声明的验证

时间:2017-11-13 15:27:45

标签: c# asp.net-mvc asp.net-identity-2

我正在使用带有MVC的ASP.NET Identity,并且我为每个设备的每个登录用户设置了一个sessionId(GuId字符串)。这个想法是用户可以删除设备会话,然后该设备将不再登录(就像在dropbox和google中完成的那样)。

目前,我将此sessionId设置为ASP.NET Identity中的声明,因此它将在身份验证cookie中传递。

对于Authenrication,我使用ASP.NET Identity作为示例:app.UseCookieAuthentication(new CookieAuthenticationOptions {....

我的问题:

  1. 是否将我的sessionId设置为声明正确的方法?

  2. 此外,在整个身份验证过程中,我可以验证该sessionId的声明吗?

  3. 我目前的想法是针对每个请求针对数据库表验证此sessionId。我应该使用Request.Sessions来存储sessionId,还是其他任何想法?

  4. 谢谢,

1 个答案:

答案 0 :(得分:1)

由于用户可以拥有多个有效会话,您可能需要将这些会话存储为声明或创建自己的表来存储它们。由于声明已经由Identity创建,因此这将是最简单的。

您可以使用OnValidateIdentityCookieAuthenticationProvider的{​​{1}}方法对此进行验证。目前,这会调用Startup.Auth.cs的{​​{1}}方法,因此您需要编写一个包装方法,首先检查您的会话ID,然后调用原始安全标记验证程序。例如,您可以将这些方法添加到OnValidateIdentity类:

SecurityStampValidator

其中Startup只是原始方法,private Func<CookieValidateIdentityContext, System.Threading.Tasks.Task> _validate=SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)); private async Task validate(CookieValidateIdentityContext context) { var usermanager = context.OwinContext.GetUserManager<ApplicationUserManager>(); var claims = await usermanager.GetClaimsAsync(context.Identity.GetUserId()); //instead of setting to true, add your session validation logic here bool sessionIsValid=true; if (!sessionIsValid) { context.RejectIdentity(); context.OwinContext.Authentication.SignOut(context.Options.AuthenticationType); } await _validate(context); } 是您的新方法,也会检查会话ID。然后,您的_validate代码将引用新的validate方法,如下所示:

app.UseCookieAuthentication

为了完成这项工作,我认为您每次都需要检查数据库中的声明,但我相信validate最终会这样做。