aspnet core 2.0基于策略的授权不断返回403

时间:2019-01-03 19:17:18

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

我正在尝试使用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。有没有办法调试授权过程,还是我在这里遗漏了一些明显的东西?

1 个答案:

答案 0 :(得分:0)

事实证明这是由于疏忽造成的。这行:

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

应实际阅读:

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

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