await signInManager.SignInAsync(user,isPersistent: isPersistent,rememberBrowser: false);
如果你设置rememberBrowser为true,我注意到我可以杀死浏览器,杀死IIS Express,删除浏览器登录的用户,甚至重新启动我的机器,浏览器仍然被视为登录.考虑到已被授权/登录的被删除的用户将会导致希望有效用户使用的[Authorize]属性的代码中的各种问题.
那么RememberBrowser正在做的是什么呢,有没有人有可能假装记住他们的Cookie中的浏览器绕过OWIN登录?似乎[授权]的要点是保证没有人登录的用户访问给定的控制器操作,并记住浏览器似乎是一个洞中的保证.
奖金问题:有没有办法禁用rememberBrowser,以便即使伪造的cookie进来,它会被拒绝?
解决方法
以下是为“rememberBrowser”创建身份的代码CreateTwoFactorRememberBrowserIdentity(https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Owin/Extensions/AuthenticationManagerExtensions.cs行215):
public static ClaimsIdentity CreateTwoFactorRememberBrowserIdentity(this IAuthenticationManager manager,string userId) { if (manager == null) { throw new ArgumentNullException("manager"); } var rememberBrowserIdentity = new ClaimsIdentity(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); rememberBrowserIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier,userId)); return rememberBrowserIdentity; }
所以这个身份的类型是“TwoFactorRememberBrowserCookie”,只有用户ID的声明.
查看使用此代码的SignInManager的源代码:(https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Owin/SignInManager.cs第106行):
if (rememberBrowser) { var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id)); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent },userIdentity,rememberBrowserIdentity); }
这里IAuthenticationManager用于登录2个身份:一个用于实际用户,另一个用于“rememberBrowser”.我相信这会产生2个cookie – 一个用户验证cookie,另一个记住浏览器.
在SignInManager中使用SignInOrTwoFactor时,代码(第218行)检查Cookie中是否已经设置了“RememberBrowser”标识.
OWIN Cookie受加密保护,加密来自DpapiDataProtector(documentation).我不是加密技术的专家,所以不能评论加密的实力.我只是说“rememberBrowser”cookie的加密方式与主认证cookie相同.
关于您重新启动IIS,机器等的练习.您是否从浏览器中删除了Cookie?因为如果没有,Identity(或者说OWIN)会将浏览器视为已登录,即使原始用户记录从数据库中删除.虽然用户不会登录,只要默认模板MVC中有代码检查用户记录的数据库,并注销用户记录已更改.
至于禁用“rememberBrowser” – 总是把错误传给该参数.而第二个cookie不会被设置.