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";
}
}