如何在 ASP.NET Core 6 中使用多種身份驗證

上一篇,我們學習了怎麼自訂身分驗證
ASP.NET Core 6 實作自訂 Authentication 身份驗證,以 Basic Authentication 例 | 余小章 @ 大內殿堂 - 點部落 (dotblogs.com.tw) ,如果一個服務需要有多種以上的驗證,ASP.NET Core 也有支援,接下來我們就來看看怎麼在服務裡面增加多種驗證吧

開發環境

  • .NET 6
  • Rider 2022.2.3

 

ApiKey Authentication

我想要使用 apikey +  basic 這兩種身分驗證,basic 我沿用上一篇的作法,api key 則使用 AspnetCore.Authentication.Apikey 

ApiKey Authentication,需要實作自己的驗證,代碼如下

public class ApiKey : IApiKey
{
    public string Key { get; init; }

    public string OwnerName { get; init; }

    public IReadOnlyCollection<Claim> Claims { get; init; }
}

public class ApiKeyProvider : IApiKeyProvider
{
    private readonly ILogger<IApiKeyProvider> _logger;

    public ApiKeyProvider(ILogger<IApiKeyProvider> logger)
    {
        _logger = logger;
    }

    public async Task<IApiKey> ProvideAsync(string key)
    {
        var result = new ApiKey
        {
            Key = "9527",
            OwnerName = "yao",
            Claims = new List<Claim>()
            {
                new(ClaimTypes.Name, "yao")
            }
        };
        return result;
    }
}

 

接下來在註冊這個驗證機制就可以了,作者很貼心的提供 Header、Query Params 兩種驗證方式,很棒,如果有需要客製自己的驗證,它是一個非常不錯的範例

builder.Services.AddAuthentication(ApiKeyDefaults.AuthenticationScheme)
    .AddApiKeyInHeaderOrQueryParams<ApiKeyProvider>(p =>
    {
        p.Realm = "Sample Web API";
        p.KeyName = "X-API-KEY";
    })
    ;

 

最後,別忘了加入驗證 Middleware

app.UseAuthentication();
app.UseAuthorization();

 

端點也需要加上 [Authorize]

[Authorize]
public ActionResult Get()
{
    return this.Ok("OK~好");
}

 

執行結果如下圖

 

透過 Policy 動態選擇 Authentication Scheme

當有多種驗證時,註冊 AddAuthentication 時可以選擇要使用哪一個 Policy Name,下面代碼我用 MultiAuthSchemes,然後在 AddPolicyScheme 處理 Scheme 的流程

 

完整代碼:

sample.dotblog/Program.cs at master · yaochangyu/sample.dotblog (github.com)

如此一來,只要有加上 [Authorize] 的端點就可以支援多種驗證了唷。

 

我們也可以指定 AuthenticationSchemes 套用特定的 Scheme,代碼如下:

[Authorize(AuthenticationSchemes = ApiKeyDefaults.AuthenticationScheme)] 

 

範例位置

sample.dotblog/WebAPI/Security/Lab.AspNetCore.Security/Lab.AspNetCore.Security.MultiAuthenticationSite at master · yaochangyu/sample.dotblog (github.com)

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo