如何向Windows用户添加声明

时间:2018-06-12 18:18:34

标签: .net-core windows-authentication

我有一个启用了Windows应用程序的dotnet核心api应用程序。我们有很多用户拥有特殊权限'admin'并存储在数据库中,其余都有默认权限'user'。我希望用户有额外的声明,他们都在数据库中。此外,我想存储更多信息,如emailid,员工编号(我必须手动从LDAP查询)

我想的是我会有一个api,比如api/auth,它将捕获当前用户并根据数据库和ldap查询添加声明,其他api端点可以使用它。

但我无法获得如何在不同的api端点之间添加和保留声明。

是否可能,或者它是一种好方法? 我有第二个选项来在每次api调用时点击数据库。

编辑1: 我编写了一个中间件来拦截所有api请求并搜索LDAP /数据库,创建ClaimsIndentity并将其添加到Users.Identity。然后通过剩余的通话即可使用。

编辑2: 当我是@Ondra Starenko的回答时,我无法引用IClaimsTransformerapp.UseClaimsTransformation。还有其他我需要包括的内容。

平台:.NET核心2.1.3

2 个答案:

答案 0 :(得分:3)

您可以在ClaimsTransformer类中向Windows用户添加Claims。

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

并将此行添加到“启动”:

app.UseClaimsTransformation(o => new ClaimsTransformer().TransformAsync(o));

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();
}

有关更多信息,请参见: add claims to windows identity

答案 1 :(得分:2)

在.NET Core 2+中,IClaimsTransformer已被弃用。而是使用IClaimsTransformation:

''

还请注意,您不应使用“ ClaimTypes.Role”。您应该使用ci.RoleClaimType-特别是如果您启用了Windows身份验证。在Windows身份验证下,ci.RoleClaimType评估为某个字符串值,该字符串值将作为角色正确获取,而ClaimTypes.Role则不会。

最后将您的ClaimsTransformer添加到Startup.cs的ConfigureServices方法中:

read_excel

您现在应该能够将基于角色的授权属性添加到Controller方法中,并且这些属性现在将被正确评估:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;

public class ClaimsTransformer : IClaimsTransformation
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var ci = (ClaimsIdentity) principal.Identity;
        var c = new Claim(ci.RoleClaimType, "Admin");
        ci.AddClaim(c);
        return Task.FromResult(principal);
    }
}