asp.net-mvc – 什么是Owin rememberBrowser做什么?

在标准ASP.Net MVC Identity 2.0 Owin实现的几个地方,您将看到rememberBrowser,如:
await signInManager.SignInAsync(user,isPersistent: isPersistent,rememberBrowser: false);

如果你设置rememberBrowser为true,我注意到我可以杀死浏览器,杀死IIS Express,删除浏览器登录用户,甚至重新启动我的机器,浏览器仍然被视为登录.考虑到已被授权/登录的被删除用户将会导致希望有效用户使用的[Authorize]属性代码中的各种问题.

那么RememberBrowser正在做的是什么呢,有没有人有可能假装记住他们的Cookie中的浏览器绕过OWIN登录?似乎[授权]的要点是保证没有人登录用户访问给定的控制器操作,并记住浏览器似乎是一个洞中的保证.

奖金问题:有没有办法禁用rememberBrowser,以便即使伪造的cookie进来,它会被拒绝?

解决方法

@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;
}

所以这个身份的类型是“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不会被设置.

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...