上篇有朋友提及到如果nginx做集群后应该还会有下一篇文章主讲session控制,一般来说就是登陆;本篇分享的内容不是关于分布式session内容,而是netcore自带的授权Authorize,Authorize粗略的用法,希望能对大家有好的帮助;
- web网站session和cookie关系
- 在NetCore中使用Authorize登陆
web网站session和cookie关系
要说session和cookie关系,恐怕有很多文章都有说过,这里我只阐述下自己的理解,尽可能的做到通俗易懂;对于session往往存储于服务端,登陆的话session一般会存储登陆用户的基本信息,还有个会话唯一sessionId(以下简称:token),这个token会分配到每个用户头上,服务端根据用户请求的token来识别服务端存储的登陆信息,以此达到登陆的目的;
客户端要传递这个同样的token,必须要存储起来,这就要用到咋们说的cookie,客户端用cookie来存储token,cookie拥有过期时间特性能够很好的做到登录失效的效果(尽管session也有),往往在分布式的时候cookie和session的失效时间都会设置,只要某一个时间过期了将视为需要重新登录或者需要重新设置cookie;下面将截图在谷歌浏览器下某个网站的cookie存储图:
能够看出cookie存储就是key-value的方式,唯一的名字+value;
在.NetCore中使用Authorize登陆
对于Authorize经常使用mvc的朋友肯定不陌生,在core中使用Authorize登录首先需要在Starup.cs的ConfigureServices方法中配置下,这里我直接给出粗略的配置吧(满足登录):
1 public void ConfigureServices(IServiceCollection services)2 {3 services.AddMvc();4 5 //配置authorrize6 services.AddAuthentication(b =>7 {8 b.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;9 b.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; 10 b.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 11 }). 12 AddCookie(b => 13 { 14 //登陆地址 15 b.LoginPath = "/login"; 16 //sid 17 b.Cookie.Name = "My_SessionId"; 18 // b.Cookie.Domain = "shenniu.core.com"; 19 b.Cookie.Path = "/"; 20 b.Cookie.HttpOnly = true; 21 b.Cookie.Expiration = new TimeSpan(0, 0, 30); 22 23 b.ExpireTimeSpan = new TimeSpan(0, 0, 30); 24 }); 25 }
下面简单说明下cookie的属性效果:
- b.Cookie.Name:就是cookie的名字,对应第一小节谷歌浏览器截图的Name;
- b.LoginPath:设置登陆失败或者未登录授权的情况下,直接跳转的路径这里,这是/login;
- b.Cookie.Domain:指定cookie对应的域名,这里我没域名和没设置本地host所以屏蔽,屏蔽的或默认localhost;
- b.Cookie.HttpOnly:设置cookie只读情况;
- b.Cookie.Expiration:cookie过期时间;
好了咋们设置完后,需要在login页面设置这样的逻辑和代码;首先是get路由,她会做两件事情:验证是否已授权登陆过和未登录显示登录试图界面:
public IActionResult OnGet() {//登录授权直接跳转index界面if (HttpContext.User.Identity.IsAuthenticated){return RedirectToPage("Index");}return Page(); }
这里利用Identity.IsAuthenticated来校验登录状态,登录了直接重定向到主页面Index这没什么说的;如果没登录,需要用户登陆下,然后在做授权,以下是用户post提交的登录请求处理:
/// <summary>/// 登录/// </summary>/// <returns></returns>public async Task<IActionResult> OnPost(){</span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (ModelState.IsValid){</span><span style="color:#008000;">//</span><span style="color:#008000;">登陆授权</span><span style="color:#0000ff;">var</span> claims = <span style="color:#0000ff;">new</span> List<Claim><span style="color:#000000;">();claims.Add(</span><span style="color:#0000ff;">new</span> Claim(ClaimTypes.Name, <span style="color:#0000ff;">this</span><span style="color:#000000;">.LoginUser.UserName));</span><span style="color:#0000ff;">var</span> indentity = <span style="color:#0000ff;">new</span> ClaimsIdentity(claims, <span style="color:#800000;">"</span><span style="color:#800000;">denglu</span><span style="color:#800000;">"</span><span style="color:#000000;">);</span><span style="color:#0000ff;">var</span> principal = <span style="color:#0000ff;">new</span><span style="color:#000000;"> ClaimsPrincipal(indentity);</span><span style="color:#0000ff;">await</span><span style="color:#000000;"> HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,principal);</span><span style="color:#008000;">//</span><span style="color:#008000;">验证是否授权成功</span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (principal.Identity.IsAuthenticated){</span><span style="color:#0000ff;">return</span> RedirectToPage(<span style="color:#800000;">"</span><span style="color:#800000;">Index</span><span style="color:#800000;">"</span><span style="color:#000000;">);}}</span><span style="color:#0000ff;">return</span><span style="color:#000000;"> Page();}</span></pre>