Owin 的 rememberBrowser 具体是做什么的?

19

在标准的ASP.Net MVC Identity 2.0 Owin实现中的几个地方,您会看到rememberBrowser,例如:

await signInManager.SignInAsync(user, isPersistent: isPersistent, rememberBrowser: false);

如果你将rememberBrowser设置为true,我发现即使杀掉浏览器、杀掉IIS Express、删除浏览器所登录的用户、甚至重启电脑,浏览器仍被视为已登录。这并不好,因为将一个已删除的用户视为已授权/已登录会在代码后台的[Authorize]属性中引起各种问题,该属性期望有一个有效的用户来使用。

那么rememberBrowser到底是在做什么呢?是否存在风险,某人可以伪造cookie来绕过OWIN登录?看起来[Authorize]的目的是确保只有已登录的用户才能访问给定的Controller Action,而rememberBrowser似乎是这个保证中的漏洞。

奖励问题:是否有一种方法可以禁用rememberBrowser,以便即使有伪造的cookie进来,也会被拒绝?

2个回答

10

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

有办法禁用rememberBrowser吗,这样即使伪造的 cookie进来了,它也会被拒绝?

从rememberBrowser创建的cookie与身份验证cookie一起使用。它只允许用户跳过2FA,因此在未经身份验证之前它是无用的。


请您澄清一下:如果它只与双因素认证有关,而标志允许用户跳过双因素认证,那么双因素认证的意义何在?我很难理解这一点。 - CodingYoshi

9
@Hezye的答案是正确的,但我会更详细地解释一下。
以下是创建“rememberBrowser”身份的代码:CreateTwoFactorRememberBrowserIdentityhttps://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”。我相信这将产生两个 cookie - 一个用户认证 cookie,另一个记住浏览器的 cookie。
SignInManager中使用SignInOrTwoFactor时,代码(第218行)检查是否已在 cookie 中设置了“RememberBrowser”身份。
OWIN cookies 受到加密保护,加密来自于 DpapiDataProtector (文档)。我不是加密方面的专家,所以无法评论加密强度。我只是说,“rememberBrowser”cookie 与主认证 cookie 以相同的方式加密。
关于您重新启动 IIS、机器等的练习。你从浏览器中删除了 cookie 吗?因为如果没有,身份验证(或者更确切地说是 OWIN)会将浏览器视为已登录,即使原始用户记录已从数据库中删除。虽然用户不会长时间登录,因为默认模板 MVC 中有检查数据库中用户记录并在更改后注销的代码。
至于禁用“rememberBrowser”,始终向该参数传递false。第二个 cookie 将不会被设置。

那么第二个“记住浏览器”的cookie,它到底是做什么的?为什么有人想要它或不想要它? - CodingYoshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接