【问题标题】:aspnet core 2.0 policy-based authorization keeps returning 403aspnet core 2.0 基于策略的授权不断返回 403
【发布时间】:2019-01-03 19:17:17
【问题描述】:

我正在尝试使用 Windows 身份验证和自定义声明来实施基于策略的身份验证方案。一切都编译并运行正常,但由于未知原因授权不断失败。这就是我正在做的事情:

1 - 在 startup.cs 中,我们添加 windows auth 作为身份验证方案,添加需要“BASIC_USER”声明的“BASIC_USER”策略,并注入声明转换器。

public void ConfigureServices(IServiceCollection services)
{

  services.AddMvc();

  services.AddTransient<IClaimsTransformation, ClaimsTransformer>();

  services.AddAuthentication(IISDefaults.AuthenticationScheme);

  services.AddAuthorization(options =>
  {
    options.AddPolicy("BASIC_USER", policy => policy.RequireClaim("BASIC_USER"));
  });

}

2 - 我们的声明转换器在每个请求中将声明添加到 ClaimsPrincipal。 (通常这会添加基于数据驱动角色的声明,但为简洁起见进行了编辑。)

public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{

    Claim claim = new Claim(ClaimTypes.Role, "BASIC_USER");

    ((ClaimsIdentity)principal.Identity)
        .AddClaim(claim);

    return await Task.FromResult(principal);

  }

}

3 - 我们用 Authorize 属性装饰我们的控制器:

  public class MyController : Controller
  {

    [Authorize(Policy = "BASIC_USER")]
    public async Task<ActionResult> Get()
    {
      ...
    }
  }

当我在上面的第 1 步和第 2 步时,一切似乎都井井有条 - 在启动时添加策略并在请求中添加声明,但控制器仍然返回格式正确的 403。有没有办法调试授权过程还是我在这里遗漏了一些明显的东西?

【问题讨论】:

    标签: authentication asp.net-web-api asp.net-core windows-authentication


    【解决方案1】:

    结果证明这是一个小小的疏忽造成的。这一行:

    options.AddPolicy("BASIC_USER", policy => policy.RequireClaim("BASIC_USER"));
    

    实际上应该是:

    options.AddPolicy("BASIC_USER", policy => policy.RequireClaim(ClaimTypes.Role, "BASIC_USER"));
    

    声明类型必须与在 TransformAsync 中添加到主体的声明类型匹配。

    【讨论】:

    • 感谢您跟进修复。超级有用!
    猜你喜欢
    • 2018-12-28
    • 2018-08-05
    • 2021-01-20
    • 2020-02-16
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2020-12-01
    • 2021-11-07
    相关资源
    最近更新 更多