asp.net-mvc - 添加基于策略的授权会跳过 JWT 持有者 token 身份验证检查吗?

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

我有一个 REST API 服务,该服务实现从 Azure AD 获取的基于 JWT 不记名 token 的身份验证。

        // 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 如果我像这样装饰我的 Controller ,并且在没有不记名 token 的情况下调用,那么我会得到预期的 401。

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

案例2 但是,如果我用策略装饰我的 Controller ,并且在没有不记名 token 的情况下进行调用,那么 REST API 调用会顺利通过,根本不需要不记名 token !!!我看到调用进入 AuthHandler HandleRequirementAsync(),然后它成功,即使未传入不记名 token 。

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

我根本无法解释这种行为。我很高兴在测试中发现了这一点,因为我认为策略检查是附加的(如“AddPolicy”调用所示),但它似乎取代了整个验证链,包括。案例 1 中由 JWT 承载中间件完成的。

我做错了什么吗?它与在ConfigureServices()中进行的Add***调用的顺序有关吗?无论策略authhandler检查是否通过,如何确保JWT承载 token 验证发生?

最佳答案

这是预期的行为。

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

关于asp.net-mvc - 添加基于策略的授权会跳过 JWT 持有者 token 身份验证检查吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49545706/

相关文章:

asp.net-mvc - ASP.Net MVC 4 和 WebApi 的身份验证

python - 如何从远程计算机获取控制台输出(ssh + python)

database - 如何在 postgresql 中为数据库创建用户?

c# - ASP.Net Core 中的日历

asp.net-mvc - 是否可以将 ReportViewer 与 ASP.NET MVC 一起使用?

c# - 如何使用 web.config 从 iis 中删除扩展

asp.net - 卡在ASP.NET 5/VS2015中的DNX引用问题上

c# - 在容器 dotnet 核心容器中运行时无法加载文件或程序集 'Newtonsoft.Json,版本 = 12.0.0.0

asp.net-mvc - ASP.NET MVC 强类型 ViewModel - 结合创建/ ListView

android - 为什么我看到这么多 auth.androidauthorizeapp 408 错误(代理的应用程序尚未安装)?