簡體   English   中英

添加基於策略的授權會跳過JWT承載令牌身份驗證檢查嗎?

[英]Adding a Policy-based Authorization skips JWT bearer token authentication check?

我有一個REST API服務,該服務實現了從Azure AD獲得的基於JWT承載令牌的身份驗證。

        // add support for custom Authorization policies
        services
            .AddAuthorization(authoptions =>
            {
                authoptions.AddPolicy("MemberOfUsersADGroup", policy =>
                    policy.Requirements.Add(new IsMemberOfUsersADGroup())
                    );
            })
            .AddSingleton<IAuthorizationHandler, IsMemberOfUsersADGroupAuthHandler>();

        // add support for this service to recieve OAUTH2 JWT bearer tokens
        services
            .AddAuthentication(authOptions =>
            {
                authOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                // token validation (REQUIRED)
                options.Audience = "AUDIENCE GUID";
                options.Authority = String.Format("https://login.microsoftonline.com/[TENANTGUID]/");
            });

以下是策略授權處理程序的實現方式。 IT 無條件地返回成功

    public class IsMemberOfSenseiUsersADGroup : IAuthorizationRequirement
{
}

    public class IsMemberOfUsersADGroupAuthHandler : AuthorizationHandler<IsMemberOfUsersADGroup>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsMemberOfUsersADGroup requirement)
    {
     // unconditional success for now
     context.Succeed(requirement);
     return Task.CompletedTask; 
    }
}

情況1如果我這樣裝飾控制器,並且在沒有承載令牌的情況下進行調用,那么我將得到預期的401。

[Authorize]
[Route("api/dostuff")]
public class DoStuffController : Controller
{

情況2,但是,如果我用策略裝飾控制器,並且在不使用承載令牌的情況下進行調用, 則REST API調用可以順利通過,根本不需要承載令牌!!! 我看到該調用進入AuthHandler HandleRequirementAsync(),然后成功,即使未傳遞承載令牌也是如此。

[Authorize(Policy = "MemberOfUsersADGroup")]
[Route("api/dostuff")]
public class DoStuffController : Controller
{

我根本無法解釋這種行為。 我很高興在測試中發現了這一點,因為我認為策略檢查是可加的(如“ AddPolicy”調用所示),但是它似乎取代了整個驗證鏈,包括。 這種情況是在案例1中由JWT承載中間件完成的。

難道我做錯了什么? 它是否與在ConfigureServices()中進行的Add ***調用的順序有關,無論策略授權處理程序是否通過檢查,如何確保JWT承載令牌驗證有效?

這是預期的行為。

如果您希望您的授權策略拒絕未經身份驗證的請求,只需調用builder.RequireAuthenticatedUser()

我遇到了同樣的問題。 我的解決方法是將控制器置於默認的[Authorize]屬性下,然后每個操作都有其自己的策略[Authorize(Policy = "MemberOfUsersADGroup")] 對我而言,這沒什么大不了的,因為我只有一個控制者,而該行動的控制者是在同一策略下。 不需要RequireAuthenticatedUser和類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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