上一篇,我們學習了怎麼自訂身分驗證
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)]
範例位置
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET