Chr*_*ini 17 asp.net-mvc authorize owin asp.net-identity-2
在标准的ASP.Net MVC Identity 2.0 Owin实现中的几个地方,你会看到rememberBrowser,如:
await signInManager.SignInAsync(user, isPersistent: isPersistent, rememberBrowser: false);
Run Code Online (Sandbox Code Playgroud)
如果你将rememberBrowser设置为true,我注意到我可以杀死浏览器,杀死IIS Express,删除浏览器登录的用户,甚至重新启动我的机器,浏览器仍被视为已登录.不太好,考虑到被删除的用户被视为授权/登录将导致在该[Authorize]属性后面的代码中出现各种问题,这些问题需要有效的用户使用.
那么rememberBrowser究竟做了什么,是否有人冒险将cookiesBrowser伪造成绕过OWIN登录?似乎重点[Authorize]是保证没有人,但登录用户访问给定的控制器动作,并且rememberBrowser似乎是该保证中的漏洞.
奖金问题:有没有办法禁用rememberBrowser,这样即使伪造的cookie确实进来,它也会被拒绝?
我认为rememberBrowser仅与双因素身份验证相关.因此,如果将其设置为true,浏览器将获取TwoFactorRememberBrowser cookie,允许用户在登录过程中跳过2FA身份验证(如果已启用).
有没有办法禁用rememberBrowser,以便即使伪造的cookie确实进来,它也会被拒绝?
从rememberBrowser创建的cookie与身份验证cookie一起使用.它只允许用户跳过2FA,因此在没有首先进行身份验证的情况下它是无用的.
@Hezye的回答是正确的,但我会详细说明这一点.
以下是为"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;
}
Run Code Online (Sandbox Code Playgroud)
因此,此标识的类型为"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);
}
Run Code Online (Sandbox Code Playgroud)
这里IAuthenticationManager用于登录2个身份:一个用于实际用户,另一个用于"rememberBrowser".我相信这将产生2个cookie - 一个用户认证cookie,另一个记住浏览器.
在SignInManager使用SignInOrTwoFactor代码时(第218行)检查是否已在cookie中设置"RememberBrowser"身份.
OWIN cookie受加密保护,加密借用DpapiDataProtector(文档).我不是密码学方面的专家,因此无法评论密码学的优势.我只是说"rememberBrowser"cookie的加密方式与主认证cookie相同.
关于你重新启动IIS,机器等的练习.你是否从浏览器中删除了cookie?因为如果没有,Identity(或者更确切地说是OWIN)会将浏览器视为已登录,即使从数据库中删除了原始用户记录也是如此.虽然用户不会长时间登录,因为默认模板MVC中有代码检查数据库中的用户记录,如果用户记录已更改则注销.
至于禁用"rememberBrowser" - 总是传递false给那个参数.并且不会设置第二个cookie.
| 归档时间: |
|
| 查看次数: |
3108 次 |
| 最近记录: |