【问题标题】:add claims to windows identity向 Windows 身份添加声明
【发布时间】:2017-01-04 16:29:47
【问题描述】:

我正在尝试将角色分配为Windows AuthenticationAsp.net Core Webapi 项目的声明。下面是我通过添加角色声明当前身份进行的转换。

public class ClaimsTransformer : IClaimsTransformer
    {
        public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
        {
            //add new claim
            var ci = (ClaimsIdentity) context.Principal.Identity;
            var c = new Claim(ClaimTypes.Role, "admin");
            ci.AddClaim(c);

            return Task.FromResult(context.Principal);
        }
    }

并将这个中间件添加到 Startup.Configure 中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
      {
          loggerFactory.AddConsole(LogLevel.Debug);
          loggerFactory.AddDebug();

          app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o));

          app.UseStaticFiles();

          app.UseMvc();
      }

但是角色admin在这个方法中没有被授权(403-禁止)。

[Route("api/[controller]")]
    public class ValuesController : Controller
    {        
        // GET api/values/5
        [HttpGet("{id}")]
        [Authorize(Roles = "admin")]
        public string Get(int id)
        {
            return "value";
        }
    }

如果使用[Authorize],它可以正常工作。有没有遗漏?

【问题讨论】:

  • 向 ClaimsIdentity 添加新声明时,如果您希望它与 IPrincipal.IsInRole(和 AuthorizeAttribute(Roles=) 一起使用,那么您需要添加声明类型为 ClaimTypes.GroupSid 而不是比 ClaimTypes.Role。奇怪但真实。
  • 我认为如果您尝试将其添加为ClaimTypes.GroupSid 为“管理员”,您将获得System.ComponentModel.Win32Exception: The trust relationship between the primary domain and the trusted domain failed

标签: authentication asp.net-web-api asp.net-core authorization asp.net-core-mvc


【解决方案1】:

不幸的是,User.IsInRole 方法不适用于 ClaimsTransformer(如果您使用 ClaimsTransformer 添加角色,IsInRole 将为 false),因此您不能将 [Authorize(Roles = "")] 与 ClaimsTransformer 一起使用。在这种情况下,您可以使用基于声明的授权来处理授权。

所以将以下代码添加到 ConfigureServices 并使用 Authorize 属性:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddAuthorization(options =>
    {
        options.AddPolicy("admin", policy => policy.RequireClaim(ClaimTypes.Role, "admin"));
    });
    //...
}


[Route("api/[controller]")]
public class ValuesController : Controller
{        
    // GET api/values/5
    [HttpGet("{id}")]
    [Authorize(Policy = "admin")]
    public string Get(int id)
    {
        return "value";
    }
}

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 2012-02-25
    • 2021-06-30
    • 2017-12-08
    • 2022-01-22
    • 2017-12-01
    • 2019-07-21
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多