如何在ASP.NET Core中使用Cookie中间件的详细介绍


本文摘自PHP中文网,作者黄舟,侵删。

本篇文章主要介绍了详解在ASP.NET Core 中使用Cookie中间件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在 http:// ASP.NET Core 中使用Cookie中间件

ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分配到HttpContext对象的User属性中。如果你想提供自己的登录方式和用户数据你可以使用Cookie中间件来实现独立的功能。

添加和配置

第一步是增加Cookie中间件到你的应用中。首先使用nuget增加Microsoft.AspNetCore.Authentication.Cookies 程序包。然后添加下面的几行代码到Startup.cs文件的Configure方法中,且要在app.UseMvc()之前。

1

2

3

4

5

6

7

8

app.UseCookieAuthentication(new CookieAuthenticationOptions()

 {

  AuthenticationScheme = "MyCookieMiddlewareInstance",

  LoginPath = new PathString("/Account/Unauthorized/"),

  AccessDeniedPath = new PathString("/Account/Forbidden/"),

  AutomaticAuthenticate = true,

  AutomaticChallenge = true

 });

上面的代码片段配置了一下几个选项;

  1. 认证方案:这是一个已知中间件的值,当有多个实例的中间件如果你想限制授权到一个实例时这个选项将会起作用。

  2. 登录路径:这是当用户试图访问资源但未经过身份验证时,程序将会将请求重定向到这个相对路径。

  3. 禁止访问路径:当用户试图访问资源时,但未通过该资源的任何授权策略,请求将被重定向到这个相对路径。

  4. 自动认证:这个标志表明中间件应该会在每个请求上进行验证和重建他创建的序列化主体。

  5. 自动挑战:这个标志标明当中间件认证失败时应该重定向浏览器到登录路径或者禁止访问路径。

其他选项包括设置中间件所创建的声明的发行者,中间件存储的cookie名称,Cookie的域和cookie上的各种安全属性。默认情况下Cookie中间件将使用适当的安全选项,设置HTTPONLY避免cookie在客户端被JavaScript操作。当请求方式为HTTPS时限制Cookie的HTTPS操作。

创建Cookie

创建Cookie保存自己的信息,必须要初始化一个ClaimsPrincipal(类型)来序列化和保存你想保存的用户信息到Cookie中。每一次的方法调用都会在你的Controller(控制器)中有一个合适的ClaimsPrincipal对象。

复制代码 代码如下:

1

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

上面的代码将会创建一个加密的Cookie并且增加到当前的请求响应中。AuthenticationScheme明确规定在配置期间

退出

退出当前用户的登录,删除登录的cookie信息,可以在控制器中调用下面的方法。

复制代码 代码如下:

1

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

响应后端的变化

警告

一旦cookie创建就会成为身份单一认证的来源,即使在后台系统已经不可用,中间件也是不知道的,并且始终保持登录直到cookie失效。

Cookie认证中间件在他的选项类中提供了一系列的事件,其中 ValidateAsync() 事件可以用来中断和重写cookie认证的验证方法。

考虑到后台用户的数据库中可能会有‘最后的修改时间'这一列,为了在数据库修改之后你可以废止当前的Cookie,第一当创建这个Cookie时添加一个最后修改的声明并包含当前的值,当数据库中的数据改变时,这个值也同时更新。

实现一个ValidateAsync()的事件重写你必须写一个具有如下签名的方法。

1

Task ValidateAsync(CookieValidatePrincipalContext context);

ASP.NET Core 认证在SecurityStampValidator中实现了这个验证。下面是一个类似的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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("MyCookieMiddlewareInstance");

   }

  }

 }

这些要在Cookie中间件配置时进行注册

1

2

3

4

5

6

7

8

app.UseCookieAuthentication(options =>

 {

  options.Events = new CookieAuthenticationEvents

  {

   // Set other options

   OnValidatePrincipal = LastChangedValidator.ValidateAsync

  };

 });

如果你想非破坏性的更新用户主体,例如,name更新了,要想以不影响安全的方式你可以调用 context.ReplacePrincipal() 并且设置 context.ShouldRenew 为 true 。

控制Cookie选项

CookieAuthenticationOptions配备了各种各样的配置选项是你能够很好的调节创建的Cookie。

  1. ClaimsIssuer - 被用来在任何中间件创建的属性之上。(看不懂)

  2. CookieDomain - 如果cookie domain被设置为 ** . http:// contoso.com ** 那么 contoso.com, http://www. contoso.com,staging.contoso.com 等等类似这样的域名也会被允许。

  3. CookieHttpOnly - 这个标志指示这个 cookie 只会被服务端访问。默认值是true,修改这个属性将会开放你的应用造成 Cookie 盗窃,造成跨站脚本的bug。

  4. CookiePath - 这个可以用来隔离运行在同一个 host 下的应用。如果你有一个应用运行在 /app1 上,并且想限制 cookie 限制仅仅被发送给自己,那么你应该设置 CookiePath 属性为 /app1 ;Cookie将会明白只适用于道 /app1 或者他下面的请求。

  5. ExpireTimeSpan - 这个 TimeSpan 时间段之后 Cookie 将会过期。

  6. SlidingExpiration - 这个标志标记了如果超过了过期时间的一半后被访问那么Cookie将会被重置。新的过期时间将会后移到当前时间加上ExpireTimespan之后。当调用 SignInAsync 时可以通过 ** AuthenticationProperties ** 设置绝对的过期时间。通过限制验证cookie有效的时间,绝对期满可以提高应用程序的安全性。

持续性Cookie和绝对过期时间

您可能希望通过浏览器会话使cookie过期。也许你也想通过绝对过期时间和认证来结束cookie,那么你可以在登录认证和创建Cookie时使用HttpContext.Authentication.SignInAsync方法中的AuthenticationProperties参数类实现。AuthenticationProperties类在Microsoft.AspNetCore.Http.Authentication命名空间中。

例如

1

2

3

4

5

6

7

await HttpContext.Authentication.SignInAsync(

  "MyCookieMiddlewareInstance",

  principal,

  new AuthenticationProperties

  {

   IsPersistent = true

  });

这个代码片段将会实现创建一个认证和相应的Cookie来实现即时浏览器关闭Cookie也能继续保留。任何在cookie属性中的过期时间的设置都将会保存下来。如果浏览器关闭时Cookie也过期了那么在重新启动浏览器是Cookie将会别清理。

阅读剩余部分

相关阅读 >>

asp.net关于cookie跨域的问题

asp.net页脚制作详解

asp.net完成文件上传的代码教程

asp.net core项目配置教程(6)_实用技巧

.net core使用redis发布订阅方法介绍

asp.net mvc 对用户输入的字符串做trim处理的方法实例

[asp.net mvc 小牛之路]07 - url routing

asp.net简单的格式转换方法

[asp.net mvc 小牛之路]08 - area 使用

asp.net数据库密码:md5加密算法详解

更多相关阅读请进入《asp.net》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...