[英]JwtBearer Authentication with Custom Authorization in .net core 2.1
我們有一個網關(使用Ocelot實現),該網關在到達API之前執行調用的身份驗證和授權
對於身份驗證,網關使用JwtBearer,如下所示
services.AddAuthentication(Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Events = JwtBeaerEvents();
options.TokenValidationParameters = TokenValidationParameters(tokenConfig);
});
並且,這可以正確驗證令牌。
除此之外,網關還通過“自定義授權”實現,並使用自定義配置文件向其讀取與權限相關的設置。 並且,此自定義授權被添加為中間件
我們嘗試在身份驗證中間件之后添加此授權中間件,例如
app.UseAuthentication().UseAuthorizationMiddleware();
這適用於有效令牌。 但是,對於無效的令牌,無論身份驗證失敗如何,該調用也將路由到AuthorizationMiddleware。 而且,基於這些發現,看來我們需要使用DI而不是中間件。 但是,我們想要的是一個授權的自定義實現,該實現通過配置文件(在網關中)與JwtBearer方案一起接受權限/策略/范圍,而不是在API屬性中進行修飾。 任何人都可以闡明如何實現相同目標嗎?
非常感謝您的幫助
該問題是由於.net core的行為所致。 當Identity的IsAuthenticated標志為false時,如果在身份驗證期間令牌驗證失敗的情況下,框架不會將Http StatusCode設置為401,並且它會繼續進行下一個調用。 如果僅使用基於策略的授權,則在構建授權策略時,RequireAuthenticatedUser()會自動對其進行處理。 但是,由於我們使用的是自定義中間件,因此引入了另一個中間件,該中間件復制了DenyAnonymousAuthorizationRequirement的功能,如下所示
var user = httpContext.User;
var userIsAnonymous =
user?.Identity == null ||
!user.Identities.Any(i => i.IsAuthenticated);
if (userIsAnonymous)
{
httpContext.Response.StatusCode = 401;
return Task.CompletedTask;
}
return _next(httpContext);
我們將此中間件放置在Authentication&Authorization中間件之間,此問題已解決
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.