ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User属性。如果您要提供自己的登录界面和用户数据库,可以使用作为独立功能的Cookie中间件。

ASP.NET Core 2.x的一个主要变化是不再存在Cookie中间件。取而代之的是在Startup.cs文件中的Configure方法中的调用UseAuthentication方法会添加设置HttpContext.User属性的 AuthenticationMiddleware 中间件。

添加配置

ASP.NET Core 1.x

按下列步骤操作:

  • 在您的项目中安装Microsoft.AspNetCore.Authentication.CookiesNuGet包。此包包含Cookie中间件。

  • Startup.cs文件中的Configure方法中添加下面的行,在app.UseMvc()语句之前:

        app.UseCookieAuthentication(new CookieAuthenticationOptions(){AccessDeniedPath = "/Account/Forbidden/",AuthenticationScheme = "MyCookieAuthenticationScheme",AutomaticAuthenticate = true,AutomaticChallenge = true,LoginPath = "/Account/Unauthorized/"});

ASP.NET Core 2.x

按下列步骤操作:

  • 如果不使用Microsoft.AspNetCore.All 元包,则在您的项目中安装2.0版的Microsoft.AspNetCore.Authentication.CookiesNuGet包。

  • Startup.cs文件中的Configure方法中调用UseAuthentication方法:

        app.UseAuthentication();
  • Startup.cs文件中的ConfigureServices方法中调用AddAuthenticationAddCookie方法:

        services.AddAuthentication("MyCookieAuthenticationScheme").AddCookie("MyCookieAuthenticationScheme", options => {options.AccessDeniedPath = "/Account/Forbidden/";options.LoginPath = "/Account/Unauthorized/";});

上面的代码片段配置了以下部分或全部选项:

  • AccessDeniedPath - 当用户尝试访问资源但没有通过任何授权策略时,这是请求会重定向的相对路径资源。

  • AuthenticationScheme - 这是一个已知的特定Cookie认证方案的值。当有多个Cookie验证实例,并且您想限制对一个实例的授权时,这就非常有用。

  • AutomaticAuthenticate - 此标识仅适用于ASP.NET Core 1.x。它表示Cookie身份验证应在每个请求上运行,并尝试验证和重建序列化主体。

  • AutomaticChallenge - 此标识仅适用于ASP.NET Core 1.x。这表示当授权失败时,1.x Cookie认证应将浏览器重定向到LoginPathAccessDeniedPath

  • LoginPath - 当用户尝试访问资源但尚未认证时,这是请求重定向的相对路径。

其它选项包括为Cookie认证创建的设置选项,身份验证的Cookie的名称,Cookie的域和Cookie各种安全属性。默认情况下,Cookie身份验证为其创建的任何Cookie使用适当的安全选项,例如:

  • 设置HttpOnly标志以防止客户端JavaScript中访问Cookie

  • 如果请求是通过HTTPS访问,则将Cookie限制为HTTPS

创建身份认证Cookie

要创建一个保存用户信息的cookie,您必须构建一个ClaimsPrincipal 保存您希望序列化到Cookie中的信息。

ASP.NET Core 1.x

    await HttpContext.Authentication.SignInAsync("MyCookieAuthenticationScheme", principal);

ASP.NET Core 2.x

    await HttpContext.SignInAsync("MyCookieAuthenticationScheme", principal);

这将创建一个加密的Cookie并将其添加到当前响应中。在调用SignInAsync时,必须在配置中指定的AuthenticationScheme

顺便提一下,使用的加密方式是ASP.NET Core的Data Protection系统。如果您在多台机器上进行托管、负载平衡或使用Web集群,则需要配置Data Protection才能使用相同的密钥和应用程序标识符。

Signing out(登出)

要退出当前用户并删除其Cookie,请在控制器中调用以下方法:

ASP.NET Core 1.x

    await HttpContext.Authentication.SignOutAsync("MyCookieAuthenticationScheme");

ASP.NET Core 2.x

    await HttpContext.SignOutAsync("MyCookieAuthenticationScheme");

服务端变化反馈

警告: 一旦创建了认证的Cookie,它将成为唯一的身份来源。即使您在服务系统中禁用用户,Cookie身份验证也无法了解此信息,只要Cookie有效,用户仍可登录。

Cookie认证在其选项中提供了一系列事件。ValidateAsync()事件可用于拦截和重写Cookie身份验证。

可以考虑在后端用户数据库中增加LastChanged列。为了在数据库更改时使Cookie无效,您应该首先在创建Cookie时添加一个LastChanged包含当前值的声明。数据库更改时,更新LastChanged例的值。

要重写ValidateAsync()事件的实现,您必须编写一个具有以下签名的方法:

    Task ValidateAsync(CookieValidatePrincipalContext context);

ASP.NET Core Identity 在SecurityStampValidator实现了这一逻辑,链接地址。示例如下所示:

ASP.NET Core 1.x

    public static class LastChangedValidator{            public static async Task ValidateAsync(CookieValidatePrincipalContext context)        {            // Pull database from registered DI services.       var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();            var userPrincipal = context.Principal;    // Look for the last changed claim.string lastChanged;lastChanged = (from c in userPrincipal.Claims                            where c.Type == "LastUpdated"select c.Value).FirstOrDefault();    if (string.IsNullOrEmpty(lastChanged) ||!userRepository.ValidateLastChanged(userPrincipal, lastChanged)){context.RejectPrincipal();                await context.HttpContext.Authentication.SignOutAsync("MyCookieAuthenticationScheme");}}}

然后,在Startup.cs文件中的Configure方法中将Cokie认证配置进行重写:

    app.UseCookieAuthentication(new CookieAuthenticationOptions{Events = new CookieAuthenticationEvents{OnValidatePrincipal = LastChangedValidator.ValidateAsync}});

ASP.NET Core 2.x

    public static class LastChangedValidator{            public static async Task ValidateAsync(CookieValidatePrincipalContext context)        {            // Pull database from registered DI services.        var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();                    var userPrincipal = context.Principal;    // Look for the last changed claim.string lastChanged;lastChanged = (from c in userPrincipal.Claims                            where c.Type == "LastUpdated"select c.Value).FirstOrDefault();    if (string.IsNullOrEmpty(lastChanged) ||!userRepository.ValidateLastChanged(userPrincipal, lastChanged)){context.RejectPrincipal();                await context.HttpContext.SignOutAsync("MyCookieAuthenticationScheme");}}}

然后,将在Startup.csConfigureServices方法中将Cookie服务注册进行配置:

    services.AddAuthentication("MyCookieAuthenticationScheme").AddCookie(options =>{options.Events = new CookieAuthenticationEvents{OnValidatePrincipal = LastChangedValidator.ValidateAsync};});

如果要非破坏性地更新用户主体,可以调用context.ReplacePrincipal(),并将context.ShouldRenew属性设置为true

Cookie设置选项

CookieAuthenticationOptions类提供了各种配置选项,在创建时调整Cookie的配置。

ASP.NET Core 1.x

  • ClaimsIssuer是由中间件创建的任何声明时使用的Issuer属性。

  • CookieDomain是提供Cookie的域名。默认情况下,这是发送请求的主机名。浏览器仅将Cookie提供给匹配的主机名。您可能希望对此进行调整,以便您的域中的任何主机都可以使用Cookie。例如,将Cookie域名设置为.contoso.com,可以使用Cookie的域名有contoso.comwww.contoso.comstaging.www.contoso.com等。

  • CookieHttpOnly是一个标识,指定Cookie是否只能由服务器访问。默认为true。如果您的应用程序具有Cross-Site Scripting(XSS)的问题,更改此值可能会导致Cookie被盗用。

  • CookiePath可用于隔离在相同主机名上运行的应用程序。如果你有一个应用程序在/app1中运行,并希望限制发送的Cookie只发送到该应用程序,那么您应该将CookiePath属性设置为/app1。通过这样做,Cookie只适用于对/app1或其下任何内容的请求。

  • CookieSecure是一个标识,表示创建的Cookie是否应该被限制为HTTPS,HTTP或HTTPS,或与请求相同的协议。默认为SameAsRequest

  • ExpireTimeSpanTimeSpan类型,在此时间段之后Cookie将过期。将当前日期加上此时间段为创建Cookie的到期日期。

  • SlidingExpiration是一个标识,指示当超过一半的ExpireTimeSpan间隔时,Cookie到期日期是否复位。新的到期日是当前时间加上ExpireTimespan。调用SignInAsync时,可以使用AuthenticationProperties类设置绝对到期时间。绝对到期时间可以通过限制认证Cookie有效的时间来提高应用程序的安全性。

Startup.cs文件中的Configure方法中使用CookieAuthenticationOptions的例子如下:

    app.UseCookieAuthentication(new CookieAuthenticationOptions{CookieName = "AuthCookie",CookieDomain = "contoso.com",CookiePath = "/",CookieHttpOnly = true,CookieSecure = CookieSecurePolicy.Always});

ASP.NET Core 2.x

ASP.NET Core 2.x 统一了用于配置Cookie的API。1.x API已被标记为过时,并且在CookieAuthenticationOptions类中引入了一种类型为CookieBuilder新的Cookie属性。建议您迁移到2.x API。

  • ClaimsIssuer是由Cookie认证创建的任何声明时使用的Issuer属性。

  • CookieBuilder.Domain是提供Cookie的域名。默认情况下,这是发送请求的主机名。浏览器仅将Cookie提供给匹配的主机名。您可能希望对此进行调整,以便您的域中的任何主机都可以使用Cookie。例如,将Cookie域名设置为.contoso.com,可以使用Cookie的域名有contoso.comwww.contoso.comstaging.www.contoso.com

  • CookieBuilder.HttpOnly是一个标识,指定Cookie是否只能由服务器访问。默认为true。如果您的应用程序具有Cross-Site Scripting(XSS)的问题,更改此值可能会导致Cookie被盗用。

  • CookieBuilder.Path可用于隔离在相同主机名上运行的应用程序。如果你有一个应用程序在/app1中运行,并希望限制发送的Cookie只发送到该应用程序,那么您应该将CookiePath属性设置为/app1。通过这样做,Cookie只适用于对/app1或其下任何内容的请求。

  • CookieBuilder.SameSite表示浏览器是否允许Cookie被附加到同一站点或跨站点的请求。默认为SameSiteMode.Lax

  • CookieBuilder.SecurePolicy是一个标识,表示创建的Cookie是否应该被限制为HTTPS,HTTP或HTTPS,或与请求相同的协议。默认为SameAsRequest

  • ExpireTimeSpanTimeSpan类型,在此时间段之后Cookie将过期。将当前日期加上此时间段为创建Cookie的到期日期。

  • SlidingExpiration是一个标识,指示当超过一半的ExpireTimeSpan间隔时,Cookie到期日期是否复位。新的到期日是当前时间加上ExpireTimespan。调用SignInAsync时,可以使用AuthenticationProperties类设置绝对到期时间。绝对到期时间可以通过限制认证Cookie有效的时间来提高应用程序的安全性。

Startup.csConfigureServices方法中使用CookieAuthenticationOptions的例子如下:

    services.AddAuthentication().AddCookie(options =>{options.Cookie.Name = "AuthCookie";options.Cookie.Domain = "contoso.com";options.Cookie.Path = "/";options.Cookie.HttpOnly = true;options.Cookie.SameSite = SameSiteMode.Lax;options.Cookie.SecurePolicy = CookieSecurePolicy.Always;});

持久Cookie和绝对到期时间

您可能希望Cookie在浏览器会话中持续存在,并希望设置身份和Cookie传输的绝对过期时间。这种持久性应该只能是用户显示同意,在登录时的“记住我”复选框或类似的机制启用。您可以通过在创建身份认证Cookie时调用的SignInAsync方法中使用AuthenticationProperties参数来执行这些操作。例如:

ASP.NET Core 1.x

    await HttpContext.Authentication.SignInAsync(        "MyCookieAuthenticationScheme",principal,            new AuthenticationProperties{IsPersistent = true});

上述代码片段中使用的AuthenticationProperties类,位于Microsoft.AspNetCore.Http.Authentication命名空间中。

ASP.NET Core 2.x

    await HttpContext.SignInAsync(            "MyCookieAuthenticationScheme",principal,              new AuthenticationProperties{IsPersistent = true});

上述代码片段中使用的AuthenticationProperties类,位于Microsoft.AspNetCore.Authentication命名空间中。


上面的代码段创建一个身份和相应的Cookie,直到浏览器关闭。以前通过Cookie设置选项配置的任何滑动过期设置仍然有效。如果Cookie在浏览器关闭时过期,浏览器会在重新启动后清除它。如果Cookie在浏览器关闭时过期,浏览器会在重新启动后清除它。

ASP.NET Core 1.x

    await HttpContext.Authentication.SignInAsync(        "MyCookieAuthenticationScheme",principal,            new AuthenticationProperties{ExpiresUtc = DateTime.UtcNow.AddMinutes(20)});

ASP.NET Core 2.x

    await HttpContext.SignInAsync(            "MyCookieAuthenticationScheme",principal,               new AuthenticationProperties{ExpiresUtc = DateTime.UtcNow.AddMinutes(20)});

上述代码段创建一个持续20分钟的身份和相应的cookie。这将忽略以前通过Cookie设置选项配置的任何滑动过期设置。

ExpiresUtcIsPersistent属性是互斥的。

原文:《Using Cookie Authentication without ASP.NET Core Identity》https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x
翻译:Sweet Tang
本文地址:<http://www.cnblogs.com/tdfblog/p/aspnet-core-security-authentication-cookie.html >

相关文章:

  • .NET Core 2.0 正式发布信息汇总

  • .NET Standard 2.0 特性介绍和使用指南

  • .NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决

  • .NET Core 2.0 特性介绍和使用指南

  • Entity Framework Core 2.0 新特性

  • 体验 PHP under .NET Core

  • .NET Core 2.0使用NLog

  • 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

  • 解决Visual Studio For Mac Restore失败的问题

  • ASP.NET Core 2.0 特性介绍和使用指南

  • .Net Core下通过Proxy 模式 使用 WCF

  • .NET Core 2.0 开源Office组件 NPOI

  • ASP.NET Core Razor页面 vs MVC

  • Razor Page–Asp.Net Core 2.0新功能  Razor Page介绍

原文地址:http://www.cnblogs.com/inday/p/razor-page-in-asp-net-core-2.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

ASP.NET Core 使用Cookie验证身份相关推荐

  1. Asp.Net Core 实现登录验证身份的功能

    步骤如下: 1.打开VS2019,新建ASP.NET Core Web应用程序,选择Web应用程序(模型视图控制器) 不用勾选右侧的身份认证,因为演示的是比较简单的,而勾选之后模板内容较为复杂 2.在 ...

  2. 自动化CodeReview - ASP.NET Core请求参数验证

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...

  3. ASP.NET Core 项目简单实现身份验证及鉴权

    环境 VS 2017 ASP.NET Core 2.2 目标 以相对简单优雅的方式实现用户身份验证和鉴权,解决以下两个问题: 无状态的身份验证服务,使用请求头附加访问令牌,几乎适用于手机.网页.桌面应 ...

  4. asp.net core系列 48 Identity 身份模型自定义

    一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户. Identity添加到项目时单个用户帐户选择作为身份验证机制. 默认 ...

  5. ASP.NET Core 3.0 gRPC 身份认证和授权

    一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...

  6. .NET Core使用Cookie做身份验证

    市面上见的比较多的认证协议是JWT这种颁布令牌(Access Token)的方式,同样也诞生出了OAuth2这种第三方授权框架,但是我们不要忽视了最原始的cookie认证方式,本次博客就来回顾一下这个 ...

  7. ASP.NET Core 双因素验证2FA 实战经验分享

    必读 本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明. 为了防止不提供原网址的转载,特在这里加上原文链接: 双因素认证 双因 ...

  8. ASP.NET Core Razor页面禁用防伪令牌验证

    这篇短文中,我将向您介绍如何ASP.NET Core Razor页面中禁用防伪令牌验证. Razor页面是ASP.NET Core 2.0中增加的一个页面控制器框架,用于构建动态的.数据驱动的网站:支 ...

  9. ASP.NET Core 运行原理解剖[5]:Authentication

    在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等.在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现 ...

最新文章

  1. tcpdf html 格式重叠,html - tcpdf(html2pdf)无法正确生成表格边框 - 堆栈内存溢出...
  2. SpringSecurity入门01(含源码)
  3. 计算机视觉工程师必读经典图书推荐
  4. MySQL的数据存储方式的概述
  5. OpenCV中基本数据结构(4)_Rect
  6. Redis Sentinel 源码:Redis的高可用模型分析
  7. 比较高效的表格行背景变色及选定高亮JS
  8. Backup and Recovery Basics1
  9. 趣学 C 语言(三)—— 琐碎
  10. 展开收起js动画效果
  11. 机器学习-西瓜书、南瓜书第五章
  12. 【原创】FPGA开发手记(三) PS/2键盘
  13. devexpress.xtraeditors.xtraform 类型初始值设定_远程智能电表的常见类型推荐--老王说表...
  14. 荣耀 android 5.0 root,华为荣耀畅玩5C获取EMUI5.0 安卓7.0系统的root教程
  15. 关于MOSFET驱动电阻的选择
  16. H5实现3D圣诞树效果
  17. 大数据技术之名词解释
  18. for 语句的基本用法
  19. 信息系统故障分析案例---------记一次性能检测系统故障排查
  20. Windows icon缓存的清理

热门文章

  1. pycharm提示your evalluation license has expired解决方法
  2. JavaScript开发的技巧
  3. SUSE Linux系统安全配置十条
  4. linux 批量替换
  5. 简单的作好服务器安全的几个步骤
  6. 如何通过 C# kill 指定进程?
  7. 上几个WebAPI就算微服务架构?Too Young!
  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版...
  9. OxyPlot.SkiaSharp中文显示乱码的问题
  10. 欲善其事,先利其器 | IDCF第6期DevOps案例研究回顾(附视频)