我目前有這個網路應用程式,我需要在其中使用自定義身份驗證/授權中間件。我們使用最少的 API 注冊路由,如下所示:
// snip
app.UseEndpoints(x => {
x.MapGet("/api/something", () => { ... returns something ... });
})
// snip
我們的自定義中間件要求我們配置需要授權給特定型別用戶和允許匿名訪問的所有路徑的串列。但我真正想做的是定義與作業方式AllowAnonymous()
和RequiresAuthorization(...)
作業方式類似的擴展方法:
// snip
app.UseEndpoints(x => {
x.MapGet("/api/something", () => { ... returns something ... }).RequiresAuthorization("Admins");
})
// snip
這樣我就可以避免必須記住更新中間件中的配置值,同時還將身份驗證資訊與路由定義放在同一位置。到目前為止,我似乎無法弄清楚在擴展方法中設定什么以便能夠檢查自定義中間件中每個請求的背景關系,以了解路由是否應該具有身份驗證。我猜我必須在路線上設定某種元資料,但我不確定要設定什么或在哪里設定。我嘗試檢查 asp net core 的源代碼,但它是如此的元和間接,以至于你真的永遠不知道該代碼中實際做了什么。任何指導或指示將不勝感激:D
uj5u.com熱心網友回復:
您可以添加任何元資料并在自定義中間件中對其進行分析:
public class SomeCustomMeta
{
public string Meta { get; set; }
}
app.MapGet("/test", () => Results.Ok("Hello World!"))
.WithMetadata(new SomeCustomMeta{ Meta = "Test"});
在中間件中:
public async Task InvokeAsync(HttpContext context)
{
if(context.GetEndpoint()?.Metadata.GetMetadata<SomeCustomMeta>() is { } meta)
{
Console.WriteLine($"SomeCustomMeta: {meta.Meta}");
}
await _next(context);
}
WithMetadata...
呼叫可以轉移到不錯的擴展方法:
public static class BuilderExts
{
public static TBuilder RequireCustomAuth<TBuilder>(this TBuilder builder, string meta) where TBuilder : IEndpointConventionBuilder
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
return builder.WithMetadata(new SomeCustomMeta { Meta = meta });
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505787.html