您好,登錄后才能下訂單哦!
這篇文章主要介紹“Asp.net Core中如何實現自定義身份認證功能”,在日常操作中,相信很多人在Asp.net Core中如何實現自定義身份認證功能問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Asp.net Core中如何實現自定義身份認證功能”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Asp.Net Core中雖然集成了許多常用的身份認證,但很多時候,我們還是需要實現自己的身份認證接口,本文這里就簡單的介紹下如何實現自定義身份認證接口。
首先寫一個簡單的接口。
[Authorize] [HttpGet] public object Foo() { return DateTime.Now.ToString(); }
由于有Authorize標記,訪問函數體前會判斷用戶是否通過認證,由于這里沒有通過認證,會的得到一個500錯誤。
自定義認證處理類:
實現一個IAuthenticationHandler接口即可:
public class MyAuthHandler : IAuthenticationHandler { public const string SchemeName = "MyAuth"; AuthenticationScheme _scheme; HttpContext _context; /// <summary> /// 初始化認證 /// </summary> public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) { _scheme = scheme; _context = context; return Task.CompletedTask; } /// <summary> /// 認證處理 /// </summary> public Task<AuthenticateResult> AuthenticateAsync() { var req = _context.Request.Query; var isLogin = req["isLogin"].FirstOrDefault(); if (isLogin != "true") { return Task.FromResult(AuthenticateResult.Fail("未登陸")); } var ticket = GetAuthTicket("test", "test"); return Task.FromResult(AuthenticateResult.Success(ticket)); } AuthenticationTicket GetAuthTicket(string name, string role) { var claimsIdentity = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, name), new Claim(ClaimTypes.Role, role), }, "My_Auth"); var principal = new ClaimsPrincipal(claimsIdentity); return new AuthenticationTicket(principal, _scheme.Name); } /// <summary> /// 權限不足時的處理 /// </summary> public Task ForbidAsync(AuthenticationProperties properties) { _context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return Task.CompletedTask; } /// <summary> /// 未登錄時的處理 /// </summary> public Task ChallengeAsync(AuthenticationProperties properties) { _context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; return Task.CompletedTask; } }
主體函數是AuthenticateAsync,主要進行了如下幾步
首先是根據http上下文判斷用戶是否通過認證,這里我實現的比較簡單,判斷下querystring中的IsLogin是否為true,為true則通過驗證。如果通過認證,則生成一個ClaimsPrincipal對象,返回認證成功
ClaimsPrincipal對象它是.net core的驗證模型。ASP.NET Core 的驗證模型是claims-based authentication,網上有一些文章來介紹他Introduction to Authentication with ASP.NET Core。他們代表的意義如下:
Claim是用戶信息,例如用戶名,角色,郵件。一般常用的是用戶名和角色。特別是角色,經常接用于授權信息中。一組claims構成了一個identity,構成了ClaimsIdentity對象,可以把ClaimsIdentity理解為"證件",駕照是一種證件,護照也是一種證件。理解記錄了用戶的基本信息。ClaimsIdentity的持有者就是ClaimsPrincipal,一個ClaimsPrincipal可以持有多個ClaimsIdentity,就比如一個人既持有駕照,又持有護照。
認證通過后,也可以通過HttpContext.User屬性獲取這個對象,從而獲取用戶名,角色等信息
注冊自定義認證處理類:
在startup.cs中進行如下配置:
開啟身份驗證中間件
app.UseAuthentication(); app.UseAuthorization();
配置選項
services.AddAuthentication(options => { options.AddScheme<MyAuthHandler>(MyAuthHandler.SchemeName, "default scheme"); options.DefaultAuthenticateScheme = MyAuthHandler.SchemeName; options.DefaultChallengeScheme = MyAuthHandler.SchemeName; });
測試:
上述功能完成后,再進行前面的測試,在url中帶上認證信息訪問:
可以看到這次能成功訪問接口,說明認證信息是生效了的。
到此,關于“Asp.net Core中如何實現自定義身份認證功能”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。