Authentication 向windows标识添加声明

Authentication 向windows标识添加声明,authentication,asp.net-web-api,asp.net-core,authorization,asp.net-core-mvc,Authentication,Asp.net Web Api,Asp.net Core,Authorization,Asp.net Core Mvc,我正在尝试为Asp.net核心Webapi项目分配角色作为Windows身份验证的声明。下面是我通过添加角色声明当前身份进行的转换 public class ClaimsTransformer : IClaimsTransformer { public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) { //add new

我正在尝试为
Asp.net核心Webapi
项目分配角色作为
Windows身份验证的声明。下面是我通过添加角色声明当前身份进行的转换

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);
        }
    }
但是,此方法中未授权角色
admin
(403禁止)


如果使用了
[Authorize]
,则它工作正常。缺少任何内容?

很遗憾,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";
    }
}

不幸的是,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";
    }
}

请看向ClaimsEntity添加新声明时,如果希望它与IPrincipal.IsInRole(和AuthorizeAttribute(Roles=)一起使用,则需要使用声明类型ClaimTypes.GroupSid而不是ClaimTypes.Role.奇怪但正确。我认为如果尝试将其添加为
ClaimTypes.GroupSid
作为“admin”您会得到一个
System.ComponentModel.Win32Exception:主域和受信任域之间的信任关系失败
如果希望它与IPrincipal.IsInRole(和AuthorizeAttribute(角色=)一起工作,请在向ClaimsEntity添加新声明时查看,然后您需要将其添加为声明类型ClaimTypes.GroupSid,而不是ClaimTypes.Role。奇怪但正确。我认为,如果您尝试将其添加为
ClaimTypes.GroupSid
作为“admin”,您会得到一个
System.ComponentModel.Win32异常:主域和受信任域之间的信任关系失败
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";
    }
}