【发布时间】:2017-01-04 16:29:47
【问题描述】:
我正在尝试将角色分配为Windows Authentication 的Asp.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