Owin记得浏览器究竟做了什么?

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确实进来,它也会被拒绝?

Hez*_*zye 8

我认为rememberBrowser仅与双因素身份验证相关.因此,如果将其设置为true,浏览器将获取TwoFactorRememberBrowser cookie,允许用户在登录过程中跳过2FA身份验证(如果已启用).

有没有办法禁用rememberBrowser,以便即使伪造的cookie确实进来,它也会被拒绝?

从rememberBrowser创建的cookie与身份验证cookie一起使用.它只允许用户跳过2FA,因此在没有首先进行身份验证的情况下它是无用的.


tra*_*max 8

@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.