向 Windows 身份添加声明
Posted
技术标签:
【中文标题】向 Windows 身份添加声明【英文标题】:add claims to windows identity 【发布时间】: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]
,它可以正常工作。有没有遗漏?
【问题讨论】:
看看***.com/a/39032988/5426333 向 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
【参考方案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";
【讨论】:
以上是关于向 Windows 身份添加声明的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 中将角色添加到 Windows 身份验证
如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?
从基于 Sharepoint 声明的身份验证 Web 应用程序中的代码访问 Windows 共享