Asp.net Core中實現(xiàn)自定義身份認證的示例代碼
Asp.Net Core中雖然集成了許多常用的身份認證,但很多時候,我們還是需要實現(xiàn)自己的身份認證接口,本文這里就簡單的介紹下如何實現(xiàn)自定義身份認證接口。
首先寫一個簡單的接口。
[Authorize] [HttpGet] public object Foo() { return DateTime.Now.ToString(); }
由于有Authorize標(biāo)記,訪問函數(shù)體前會判斷用戶是否通過認證,由于這里沒有通過認證,會的得到一個500錯誤。
自定義認證處理類:
實現(xiàn)一個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> /// 權(quán)限不足時的處理 /// </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; } }
主體函數(shù)是AuthenticateAsync,主要進行了如下幾步
首先是根據(jù)http上下文判斷用戶是否通過認證,這里我實現(xiàn)的比較簡單,判斷下querystring中的IsLogin是否為true,為true則通過驗證。如果通過認證,則生成一個ClaimsPrincipal對象,返回認證成功
ClaimsPrincipal對象它是.net core的驗證模型。ASP.NET Core 的驗證模型是claims-based authentication,網(wǎng)上有一些文章來介紹他Introduction to Authentication with ASP.NET Core。他們代表的意義如下:
Claim是用戶信息,例如用戶名,角色,郵件。一般常用的是用戶名和角色。特別是角色,經(jīng)常接用于授權(quán)信息中。一組claims構(gòu)成了一個identity,構(gòu)成了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中帶上認證信息訪問:
可以看到這次能成功訪問接口,說明認證信息是生效了的。
到此這篇關(guān)于Asp.net Core中實現(xiàn)自定義身份認證的示例代碼的文章就介紹到這了,更多相關(guān)Asp.net Core自定義身份認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.NET Core3.1 Ocelot認證的實現(xiàn)
- ASP.NET Core使用JWT認證授權(quán)的方法
- 深入解讀ASP.NET Core身份認證過程實現(xiàn)
- ASP.NET Core 實現(xiàn)基本認證的示例代碼
- ASP.NET Core學(xué)習(xí)之使用JWT認證授權(quán)詳解
- ASP.NET Core Authentication認證實現(xiàn)方法
- 淺談ASP.NET Core 中jwt授權(quán)認證的流程原理
- ASP.Net Core3.0中使用JWT認證的實現(xiàn)
- Asp.Net Core基于JWT認證的數(shù)據(jù)接口網(wǎng)關(guān)實例代碼
- ASP.NET學(xué)習(xí)CORE中使用Cookie身份認證方法
- Asp.Net Core添加請求頭自定義認證的示例
相關(guān)文章
.NetCore使用MailKit發(fā)送和接收郵件的方法
MailKit是一個開源的.NET庫,提供了對SMTP、POP3和IMAP的訪問,使得發(fā)送和接收電子郵件變得簡單,下面是一個基本的示例,展示了如何使用MailKit來發(fā)送和接收郵件,感興趣的朋友跟隨小編一起看看吧2024-07-07ASP.Net Post方式獲取數(shù)據(jù)流的一種簡單寫法
這篇文章主要介紹了ASP.Net Post方式獲取數(shù)據(jù)流的一種簡單寫法,本文直接給出代碼實例,需要的朋友可以參考下2015-05-05asp.net(C#)函數(shù)對象參數(shù)傳遞的問題
我們知道在.net里class是引用類型,在函數(shù)參數(shù)表中的對象傳遞的都是對象的引用,所以在函數(shù)體內(nèi)對其對象參數(shù)的修改會影響函數(shù)外對應(yīng)的對象本身,例如下面的程序.2009-12-12更方便快捷的外部操作數(shù)據(jù)庫的方法(另類玩法)
數(shù)據(jù)庫操作方法很多,各種各樣但是外部操作數(shù)據(jù)庫的方法就會顯得格外陌生了,感興趣的朋友可以詳細了解下本文,或許對你學(xué)習(xí)ado.net有所幫助2013-02-02ASP.NET+XML打造網(wǎng)絡(luò)硬盤原理分析
文件傳送常用的三種方式:FTP、Email及網(wǎng)上鄰居,都在一定程度上實現(xiàn)了文件數(shù)據(jù)的交流,但它們都主要面向“點對點”的傳送,無法實現(xiàn)一塊空間,資源互見的應(yīng)用需求,這種基于點對多的共享模式需要尋求另外的傳輸途徑,網(wǎng)絡(luò)硬盤就是一種很好的解決方式2012-09-09