向 Windows 身份添加声明

Posted

技术标签:

【中文标题】向 Windows 身份添加声明【英文标题】:add claims to windows identity 【发布时间】: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],它可以正常工作。有没有遗漏?

【问题讨论】:

看看***.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 身份添加声明的主要内容,如果未能解决你的问题,请参考以下文章

Metro应用程序中可以进行Windows身份验证吗?

如何在 ASP.NET Core 中将角色添加到 Windows 身份验证

如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?

从基于 Sharepoint 声明的身份验证 Web 应用程序中的代码访问 Windows 共享

使用 pyodbc 从 Linux 向 Windows SQL Server 进行身份验证

ASP.NET Windows 身份验证向应用程序返回错误的用户