如何向Windows用户添加声明

Pri*_*mar 5 windows-authentication .net-core

我有一个启用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 Core 2.1.3

Ace*_*s25 10

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

最后通过将 ClaimsTransformer 添加到 Startup.cs 的 ConfigureServices 方法来注入它:

services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
Run Code Online (Sandbox Code Playgroud)

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

[Authorize(Roles = "Admin")]
[HttpGet("[action]/{id}")]        
public User GetUser([FromRoute] int id)
{
    UserLogic ul = new UserLogic();
    return ul.GetUser(id);
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说很有效,谢谢!一个问题:是否有一种方法可以为特定用户保留添加的声明,而不仅仅是当前请求? (3认同)

Ond*_*nko 5

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

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

并将此行添加到启动中:

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();
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅: 向 Windows 身份添加声明