Asp.Net Core中雖然集成了許多常用的身份認證,但很多時候,我們還是需要實現自己的身份認證接口,本文這里就簡單的介紹下如何實現自定義身份認證接口。
首先寫一個簡單的接口。
[Authorize]
[HttpGet]
public object Foo()
{
return DateTime.Now.ToString();
}
由於有Authorize標記,訪問函數體前會判斷用戶是否通過認證,由於這里沒有通過認證,會的得到一個500錯誤。
自定義認證處理類:
實現一個IAuthenticationHandler接口即可:

1 public class MyAuthHandler : IAuthenticationHandler 2 { 3 public const string SchemeName = "MyAuth"; 4 5 AuthenticationScheme _scheme; 6 HttpContext _context; 7 8 /// <summary> 9 /// 初始化認證 10 /// </summary> 11 public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) 12 { 13 _scheme = scheme; 14 _context = context; 15 return Task.CompletedTask; 16 } 17 18 /// <summary> 19 /// 認證處理 20 /// </summary> 21 public Task<AuthenticateResult> AuthenticateAsync() 22 { 23 var req = _context.Request.Query; 24 var isLogin = req["isLogin"].FirstOrDefault(); 25 26 if (isLogin != "true") 27 { 28 return Task.FromResult(AuthenticateResult.Fail("未登陸")); 29 } 30 31 var ticket = GetAuthTicket("test", "test"); 32 return Task.FromResult(AuthenticateResult.Success(ticket)); 33 } 34 35 AuthenticationTicket GetAuthTicket(string name, string role) 36 { 37 var claimsIdentity = new ClaimsIdentity(new Claim[] 38 { 39 new Claim(ClaimTypes.Name, name), 40 new Claim(ClaimTypes.Role, role), 41 }, "My_Auth"); 42 43 var principal = new ClaimsPrincipal(claimsIdentity); 44 return new AuthenticationTicket(principal, _scheme.Name); 45 } 46 47 /// <summary> 48 /// 權限不足時的處理 49 /// </summary> 50 public Task ForbidAsync(AuthenticationProperties properties) 51 { 52 _context.Response.StatusCode = (int)HttpStatusCode.Forbidden; 53 return Task.CompletedTask; 54 } 55 56 /// <summary> 57 /// 未登錄時的處理 58 /// </summary> 59 public Task ChallengeAsync(AuthenticationProperties properties) 60 { 61 _context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 62 return Task.CompletedTask; 63 } 64 }
主體函數是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中帶上認證信息訪問:
可以看到這次能成功訪問接口,說明認證信息是生效了的。