簡體   English   中英

.net core 2.1中具有自定義授權的JwtBearer身份驗證

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

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