[.NET Core] 自訂 Authentication handler

asp.net core 有很多 authentication 的方法,但有時候想要自訂驗證規則時,該怎麼做,跟著官方文件做完一次後,將自己理解的版本筆記下來

自訂 Authentication

一開始在思考這題時,繞了幾個圈,但理解後其實不難,就是實做一個 AuthenticationHandler

1
2
3
4
5
6
7
8
9
10
11
12
public class ApiAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{

public ApiAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}

protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// 回傳驗證結果
}
}

實做完上面後,就可以回到 program.cs 內做註冊的動作

1
2
3
builder.Services.AddAuthentication("Basic") // 預設 schema
.AddScheme<AuthenticationSchemeOptions, ApiAuthHandler>("Basic", o => { });
.AddScheme<AuthenticationSchemeOptions, AnotherApiAuthHandler>("SchemaName", o => { });

而這裡也允許新增多組 schema,在 API Controller 的地方也可以指定要使用哪一組 schema 做驗證

1
2
[Authorize(AuthenticationSchemes = "SchemaName")]
public void SomeFunction() { }

自訂 Options

如果希望從 Program.cs 的地方傳入設定檔,就需要自訂一個 AuthenticationSchemeOptions

1
2
3
4
5
public class ApiAuthHandlerOption: AuthenticationSchemeOptions
{
// add your custom properties
public string MyProp { get; set; } = String.Empty;
}
1
2
3
4
5
// Program.cs
builder.Services.AddAuthentication("Basic") // 預設 schema
.AddScheme<ApiAuthHandlerOption, ApiAuthHandler>("Basic", o => {
o.MyProp = "some prop";
});
1
2
3
4
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var myPro = base.Options.MyProp; // 可以取上面那段所設定的值
}

參考文件