<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Session
在使用者端第一次進行存取時,伺服器端會生成一個Session id返回到使用者端
使用者端將Session id儲存在本地後續每一次請求都帶上這個id
伺服器端從接收到的請求中根據Session id在自己儲存的資訊中識別使用者端
Cookie
在使用者端存取伺服器時,伺服器端會在響應中頒發一個Cookie
使用者端會把cookie儲存,當再存取伺服器端時會將cookie和請求一併提交
伺服器端會檢查cookie識別使用者端,並也可以根據需要修改cookie的內容
在分散式或叢集系統中使用Session
假設現在伺服器為了更好的承載和容災將系統做了分散式和叢集,也就是有了N個伺服器端,那是不是每一個伺服器端都要具有對每一個使用者端的Session或者Cookie的識別能力呢?
這個可以使用Session共用的方式用於Session的識別,但是這並不能解決分散式系統下依然存在這個問題,因為通常每一個分散式系統都由不同的人負責或者跨網路,甚至不同的公司,不可能全部都做session共用吧?這個時候就誕生了一個新的方式,使用Token
執行步驟
使用者向統一的鑑權授權系統發起使用者名稱和密碼的校驗
校驗通過後會頒發一個Token,使用者就拿著頒發的Token去存取其他三方系統
三方系統可以直接請求鑑權授權系統驗證當前Token的合法性,也可以根據對稱加密使用祕鑰解密Token以驗證合法性
Authentication:
鑑定身份資訊,例如使用者有沒有登入,使用者基本資訊
Authorization:
判定使用者有沒有許可權
在NETCORE中鑑權授權是通過AuthenticationHttpContextExtensions擴充套件類中的實現的HttpContext的擴充套件方法來完成的
public static class AuthenticationHttpContextExtensions { public static Task SignInAsync(this HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties) { context.RequestServices.GetRequiredService<IAuthenticationService>().SignInAsync(context, scheme, principal, properties); } }
它真正的核心在
Microsoft.AspNetCore.Authorization模組,整個流程處理主要包含如下幾個關鍵類
IAuthenticationHandlerProvider
負責對使用者憑證的驗證,提供IAuthenticationHandler處理器給IAuthenticationService用於處理鑑權請求,當然可以自定義處理器
IAuthenticationSchemeProvider
選擇標識使用的是哪種認證方式
IAuthenticationService
提供鑑權統一認證的5個核心業務介面
public interface IAuthenticationService { //查詢鑑權 Task<AuthenticateResult> AuthenticateAsync(HttpContext context, string scheme); //登入寫入鑑權憑證 Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties); //退出登入清理憑證 Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties); Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties); Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties); }
在它的實現類AuthenticationService中的SignInAsync方法
配合IAuthenticationHandlerProvider 和IAuthenticationSchemeProvider得到一個IAuthenticationHandler,最終將鑑權寫入和讀取都由它完成
public virtual async Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties) { if (scheme == null) { //IAuthenticationSchemeProvider範例 var defaultScheme = await Schemes.GetDefaultSignInSchemeAsync(); scheme = defaultScheme?.Name; } //IAuthenticationHandlerProvider範例獲取處理器 var handler = await Handlers.GetHandlerAsync(context, scheme); var signInHandler = handler as IAuthenticationSignInHandler; //各自的處理器handler //例如使用Cookie 就會注入一個CookieAuthenticationHandler //使用JWT 就注入一個JwtBearerHandler await signInHandler.SignInAsync(principal, properties); }
//核心原始碼就是AuthenticationMiddleware中介軟體 app.UseAuthentication();
services.AddAuthentication(options => { //CookieAuthenticationDefaults.AuthenticationScheme == "Cookies" options.DefaultAuthenticateScheme = "Cookies"; options.DefaultSignInScheme = "Cookies"; }).AddCookie();
Claims:一項資訊,例如工牌的姓名是一個Claims ,工牌號碼也是一個Claims
ClaimsIdentity:一組Claims 組成的資訊,就是一個使用者身份資訊
ClaimsPrincipal:一個使用者有多個身份
AuthenticationTicket:使用者票據,用於包裹ClaimsPrincipal
[AllowAnonymous] public async Task<IActionResult> Login(string name, string password) { if(name!="Admin" && password!="000000") { var result = new JsonResult(new{ Result = false,Message = "登入失敗"}); return result; } //Claims ⫋ ClaimsIdentity ⫋ ClaimsPrincipal var claimIdentity = new ClaimsIdentity("ClaimsIdentity"); claimIdentity.AddClaim(new Claim(ClaimTypes.Name, name)); claimIdentity.AddClaim(new Claim(ClaimTypes.Address, "地址資訊")); AuthenticationProperties ap = new AuthenticationProperties(); ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimIdentity); await base.HttpContext.SignInAsync("Cookies",claimsPrincipal , ap) return new JsonResult(new{ Result = false,Message = "登入成功"}); }
在其他控制器上標記[Authorize]特性,在存取介面框架會自動進行鑑權並將身份資訊寫入上下文
[AllowAnonymous]
:匿名可存取
[Authorize]
:必須登入才可存取
public class CoreAuthorizationHandler : IAuthenticationHandler ,IAuthenticationSignInHandler, IAuthenticationSignOutHandler { public AuthenticationScheme Scheme { get; private set; } protected HttpContext Context { get; private set; } public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) { Scheme = scheme; Context = context; return Task.CompletedTask; } public async Task<AuthenticateResult> AuthenticateAsync() { var cookie = Context.Request.Cookies["CustomCookie"]; if (string.IsNullOrEmpty(cookie)) { return AuthenticateResult.NoResult(); } AuthenticateResult result = AuthenticateResult .Success(Deserialize(cookie)); return await Task.FromResult(result); } public Task ChallengeAsync(AuthenticationProperties properties) { return Task.CompletedTask; } public Task ForbidAsync(AuthenticationProperties properties) { Context.Response.StatusCode = 403; return Task.CompletedTask; } public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) { var ticket = new AuthenticationTicket(user, properties, Scheme.Name); Context.Response.Cookies.Append("CoreAuthorizationHandlerCookies", Serialize(ticket)); return Task.CompletedTask; } public Task SignOutAsync(AuthenticationProperties properties) { Context.Response.Cookies.Delete("CoreAuthorizationHandlerCookies"); return Task.CompletedTask; } private AuthenticationTicket Deserialize(string content) { byte[] byteTicket = System.Text.Encoding.Default.GetBytes(content); return TicketSerializer.Default.Deserialize(byteTicket); } private string Serialize(AuthenticationTicket ticket) { //需要引入 Microsoft.AspNetCore.Authentication byte[] byteTicket = TicketSerializer.Default.Serialize(ticket); return Encoding.Default.GetString(byteTicket); } }
services.AddAuthenticationCore(options => { options.AddScheme<CoreMvcAuthenticationHandler>("AuthenticationScheme", "AuthenticationScheme"); });
到此這篇關於.NET CORE 鑑權的實現範例的文章就介紹到這了,更多相關.NET CORE 鑑權 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45