我正在使用带有MVC的ASP.NET Identity,并且我为每个设备的每个登录用户设置了一个sessionId(GuId字符串)。这个想法是用户可以删除设备会话,然后该设备将不再登录(就像在dropbox和google中完成的那样)。
目前,我将此sessionId设置为ASP.NET Identity中的声明,因此它将在身份验证cookie中传递。
对于Authenrication,我使用ASP.NET Identity作为示例:app.UseCookieAuthentication(new CookieAuthenticationOptions {....
我的问题:
是否将我的sessionId设置为声明正确的方法?
此外,在整个身份验证过程中,我可以验证该sessionId的声明吗?
我目前的想法是针对每个请求针对数据库表验证此sessionId。我应该使用Request.Sessions来存储sessionId,还是其他任何想法?
谢谢,
答案 0 :(得分:1)
由于用户可以拥有多个有效会话,您可能需要将这些会话存储为声明或创建自己的表来存储它们。由于声明已经由Identity创建,因此这将是最简单的。
您可以使用OnValidateIdentity
中CookieAuthenticationProvider
的{{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
最终会这样做。