添加基于策略的授权会跳过JWT承载令牌身份验证检查吗?

时间:2018-03-28 23:21:54

标签: asp.net-mvc authentication asp.net-core jwt

我有一个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 ***调用的顺序有关。无论策略authhandler检查是否通过,我如何确保JWT持有者令牌验证发生?

2 个答案:

答案 0 :(得分:2)

这是预期的行为。

如果您希望授权政策拒绝未经身份验证的请求,只需致电builder.RequireAuthenticatedUser()

答案 1 :(得分:0)

我遇到了同样的问题。我的解决方法是将控制器置于默认的[Authorize]属性下,然后每个操作都有其自己的策略[Authorize(Policy = "MemberOfUsersADGroup")]。对我而言,这没什么大不了的,因为我只有一个控制者,而该行动的控制者是在同一策略下。不需要RequireAuthenticatedUser和类似的东西。