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") .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 { public string MyProp { get; set; } = String.Empty; }
|
1 2 3 4 5
| builder.Services.AddAuthentication("Basic") .AddScheme<ApiAuthHandlerOption, ApiAuthHandler>("Basic", o => { o.MyProp = "some prop"; });
|
1 2 3 4
| protected override Task<AuthenticateResult> HandleAuthenticateAsync() { var myPro = base.Options.MyProp; }
|
參考文件