簡體   English   中英

適用於多租戶.Net Core Web API應用驗證發行人的適當位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM