asp.net-mvc – 在MVC身份(2.0.1)中的regenerateIdentity/validateInte
|
在这一天整天抓我的头。我试图在MVC Identity 2.0.1中设置“很长”的登录会话。 (30天)。 我使用以下cookie启动: app.UseCookieAuthentication(new CookieAuthenticationOptions
{
SlidingExpiration = true,ExpireTimeSpan = System.TimeSpan.FromDays(30),AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,LoginPath = new PathString("/My/Login"),CookieName = "MyLoginCookie",Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager,ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),regenerateIdentity: (manager,user) => user.GenerateUserIdentityAsync(manager))
}
});
这在整体上,工作正常。 cookie设置30天,因此,一切看起来不错。 如果我关闭浏览器,并在“validateInterval”持续时间过后回来(30分钟这里)我仍然登录,但是cookie现在重新发布为“会话”(正确的cookie名称仍然)! 30天的过期失效。 如果我现在关闭浏览器/重新打开我不再登录。 我已经测试删除“提供程序”和所有的工作,如预期那样,我可以回来几个小时后,我仍然登录罚款。 解决方法当SecurityStampValidator触发regenerateIdentity回调时,当前已认证的用户将通过非持久登录重新登录。这是硬编码,我不相信有任何方法直接控制它。因此,登录会话将只在您重新生成身份的点处继续运行的浏览器会话的结尾。这里是一种使登录持久化,甚至跨身份再生操作的方法。此描述基于使用Visual Studio MVC ASP.NET Web项目模板。 首先,我们需要有一种方法来跟踪登录会话在不同HTTP请求之间持久的事实。这可以通过向用户的身份添加“IsPersistent”声明来完成。以下扩展方法显示了一种方法。 public static class ClaimsIdentityExtensions
{
private const string PersistentLoginClaimType = "PersistentLogin";
public static bool GetIsPersistent(this System.Security.Claims.ClaimsIdentity identity)
{
return identity.Claims.FirstOrDefault(c => c.Type == PersistentLoginClaimType) != null;
}
public static void SetIsPersistent(this System.Security.Claims.ClaimsIdentity identity,bool isPersistent)
{
var claim = identity.Claims.FirstOrDefault(c => c.Type == PersistentLoginClaimType);
if (isPersistent)
{
if (claim == null)
{
identity.AddClaim(new System.Security.Claims.Claim(PersistentLoginClaimType,Boolean.TrueString));
}
}
else if (claim != null)
{
identity.RemoveClaim(claim);
}
}
}
接下来,当用户登录请求持久会话时,我们需要做出“IsPersistent”声明。例如,您的ApplicationUser类可能有一个GenerateUserIdentityAsync方法,可以更新为采用isPersistent标志参数,如下所示在需要时提出此类声明: public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager,bool isPersistent)
{
var userIdentity = await manager.CreateIdentityAsync(this,DefaultAuthenticationTypes.ApplicationCookie);
userIdentity.SetIsPersistent(isPersistent);
return userIdentity;
}
ApplicationUser.GenerateUserIdentityAsync的任何调用者现在都需要传入isPersistent标志。例如,在AccountController.SignInAsync中对GenerateUserIdentityAsync的调用将从 AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent },await user.GenerateUserIdentityAsync(UserManager));
至 AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent },await user.GenerateUserIdentityAsync(UserManager,isPersistent));
最后,在Startup.ConfigureAuth方法中使用的CookieAuthenticationProvider.OnValidateIdentity委托需要注意在标识重新生成操作中保留持久性细节。默认委托如下所示: OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager,ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(20),user) => user.GenerateUserIdentityAsync(manager))
这可以更改为: OnValidateIdentity = async (context) =>
{
await SecurityStampValidator.OnValidateIdentity<ApplicationUserManager,ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(20),// Note that if identity is regenerated in the same HTTP request as a logoff attempt,// the logoff attempt will have no effect and the user will remain logged in.
// See https://aspnetidentity.codeplex.com/workitem/1962
regenerateIdentity: (manager,user) =>
user.GenerateUserIdentityAsync(manager,context.Identity.GetIsPersistent())
)(context);
// If identity was regenerated by the stamp validator,// AuthenticationResponseGrant.Properties.IsPersistent will default to false,leading
// to a non-persistent login session. If the validated identity made a claim of being
// persistent,set the IsPersistent flag to true so the application cookie won't expire
// at the end of the browser session.
var newResponseGrant = context.OwinContext.Authentication.AuthenticationResponseGrant;
if (newResponseGrant != null)
{
newResponseGrant.Properties.IsPersistent = context.Identity.GetIsPersistent();
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用ASP.Net webforms和MVC进行Ninject
- .net – %#%和%=%有什么区别?
- asp.net – 什么是system.globalization它和本地化有什么区
- 为熟悉ASP.NET Web表单开发的人建议MVC3的周末学习轨道
- asp.net – 如何接收JSON作为MVC 5操作方法参数
- 为什么ASP.NET框架在响应中添加“X-Powered-By:ASP.NET”H
- asp.net – IIS URL重写模块url为小写
- asp.net-mvc – Asp.Net MVC 2 – 更改PropertyValueRequir
- asp.net-mvc – 使用带有剃刀的html选择框
- asp.net-mvc – 如何单元测试返回ContentResult的ActionRes
- asp.net-mvc – 具有接受routeValues和htmlAttri
- asp.net-mvc-4 – 覆盖用于MVC4应用程序的User.I
- asp.net – 我应该在服务层或控制器层发送电子邮
- asp.net – 在javascript中读取cookie
- asp.net-mvc – ASP.NET MVC Beta 1 – 哪里是Ht
- asp.net core标签助手的高级用法TagHelper+Form
- asp.net-mvc-4 – 如何在ASP.NET MVC中使用React
- asp.net中的泛型处理程序是什么?
- .net – 应用程序池限制
- asp.net-mvc-2 – Asp.Net MVC DropDownList数据
