1. 程式人生 > 程式設計 >Asp.net Core中實現自定義身份認證的示例程式碼

Asp.net Core中實現自定義身份認證的示例程式碼

Asp.Net Core中雖然集成了許多常用的身份認證,但很多時候,我們還是需要實現自己的身份認證介面,本文這裡就簡單的介紹下如何實現自定義身份認證介面。

首先寫一個簡單的介面。

[Authorize]
[HttpGet]
public object Foo()
{
  return DateTime.Now.ToString();
}

由於有Authorize標記,訪問函式體前會判斷使用者是否通過認證,由於這裡沒有通過認證,會的得到一個500錯誤。

Asp.net Core中實現自定義身份認證的示例程式碼

自定義認證處理類:

實現一個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中實現自定義身份認證的示例程式碼

可以看到這次能成功訪問介面,說明認證資訊是生效了的。

到此這篇關於Asp.net Core中實現自定義身份認證的示例程式碼的文章就介紹到這了,更多相關Asp.net Core自定義身份認證內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!