[英]Proper place to validate issuer for multi-tenant .Net Core Web API app
我正在開發一個多租戶SPA應用程序,它可以調用后端.Net Core Web API來獲取數據。 前端UI將使用MSAL和Microsoft的v2公共端點來針對AAD驗證用戶並獲取id和訪問令牌。
在我的Web API,我要驗證的發行人,但如前所述這里 ,使用共同的端點提供,使正常的發行人確認未可用的元數據。
我已經看到了幾個可以覆蓋或自定義令牌驗證的地方的引用,但我不確定哪個是首選的,或者這些方法中的任何一個是否會導致不希望的副作用。
一種方法使用JwtBearer選項的事件: options.Events.TokenValidated
,另一種方法使用TokenValidationParameters的IssuerValidator
委托。
我不想寫任何令牌驗證邏輯,只是確保發布者存在於我的經過驗證的發布者數據庫中。 該邏輯應該在IssuerValidator
還是TokenValidated
?
我當前的代碼看起來像這樣(目前設置為單租戶)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://myauthority.com";
options.Audience = "https://myaudience.com/api/v1";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "myauthority.com",
ValidateAudience = true,
ValidAudience = "https://myaudience.com",
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
};
});
我在使用IssuerValidator
一個問題是,似乎沒有辦法注入或傳入對能夠在數據庫中查找租戶ID所需的dbContext的引用。
有沒有人解決這個問題或做過類似的事情?
您可以在OnTokenValidated
事件中檢查,要訪問數據庫上下文,您可以嘗試:
options.Events.OnTokenValidated = async (context) =>
{
var dbContext = context.HttpContext.RequestServices.GetRequiredService<BloggingContext>();
var blogs = await dbContext.Blogs.ToListAsync();
if (!true)
{
throw new SecurityTokenValidationException($"Tenant xxxxx is not registered");
}
};
哇,所以這導致我走了很長的路! 正如您所指出的那樣,大多數文檔都指向設置ValidateIssuer = false
並留在那里。 我嘗試了IssuerValidator
,但我沒有得到任何結果。 我找到的是IAuthorizationHandler
。 我已經使用IMyService創建了一個PoC來代替DBContext。 我離開了ValidateIssuer = false
。
public class IssuerAuthorizationHandler : IAuthorizationHandler
{
private readonly IMyService _service;
public IssuerAuthorizationHandler(IMyService service)
{
_service = service ?? throw new ArgumentNullException(nameof(service));
}
public Task HandleAsync(AuthorizationHandlerContext context)
{
if (context.User.FindFirst("iss") != null)
{
string issuer = context.User.FindFirst("iss").Issuer;
// do issuer validation here
}
else
{
// fail the authentication
context.Fail();
}
return Task.CompletedTask;
}
}
將其添加到DI
services.AddScoped<IAuthorizationHandler, IssuerAuthorizationHandler>();
希望這有幫助
更新:
過濾管道顯示何時調用授權處理程序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.