0

我需要根据本地 Active Directory 中的一些信息实现自定义授权。在做了一些研究之后,我认为最好的方法是编写一个自定义身份验证过滤器并将 AD 中的信息添加到声明列表中。

因此,在 IIS 使用 Windows 身份验证对用户进行身份验证后,我计划阅读一些信息并将其放入声明列表中:

public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
  var claims = new List<Claim>();
  claims.Add(new Claim(ClaimTypes.Name, userPrincipal.Name));
  claims.Add(new Claim(ClaimTypes.Role, "client"));
  claims.Add(new Claim("Accounts", "[List of accounts from AD]"));

  var identity = new ClaimsIdentity(claims);

  var principal = new ClaimsPrincipal(new[] { identity });
  context.Principal = principal;
        
  Thread.CurrentPrincipal = context.Principal;
}

我相信这种方法将允许我从任何控制器访问帐户列表。但是,我无法IAuthenticationFilter使用以下方法将我的实现添加到全局过滤器列表中。

builder.Services.AddControllers(config =>
{
    config.Filters.Add(new ApiAuthenticationFilter())
});

这个方法需要IFilterMetaData接口,而我已经实现了IAuthenticationFilter. 在以前的 Web API 版本中,我们可以通过方法访问,但HttpConfigurationApplication_Start()ASP.NET Core 6 Web API 中,我无法找到将过滤器添加到HttpConfiguration.

您能否告诉我这是否是正确的方法,或者我应该尝试实现IActionFilter接口?或者完全不同的方法。

谢谢!

4

1 回答 1

0

我认为IAuthenticationFilter将声明添加到ClaimsPrincipal. 还有另一个界面IClaimsTransformation完全符合我的要求。

ASP.NET 网站上发布的示例正在创建一个新ClaimsIdentity实例,ClaimsPrincipal而我只需添加到现有声明列表即可实现这一目标:

public class MyClaimsTransformation : IClaimsTransformation
{
    private readonly IActiveDirectoryService _activeDirectoryService;

    public MyClaimsTransformation(IActiveDirectoryService activeDirectoryService)
    {
        _activeDirectoryService = activeDirectoryService;
    }


    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var identity = principal.Identities.FirstOrDefault(c => c.IsAuthenticated);

        if (identity == null)
        {
            return principal;
        }

        var user = _activeDirectoryService.GetUser(principal.Identity as WindowsIdentity);

        // Add or replace identity.Claims

        if (!principal.HasClaim(c => c.Type == MyClaimTypes.ACCOUNTS))
        {
            identity.AddClaim(new Claim(MyClaimTypes.ACCOUNTS, user.Accounts));

        }

        return principal;
    }
}

使用的另一个优点IClaimsTransformation是能够通过 .Net core DI 容器注入依赖项。

在我的 Program.cs 中,我无法使用推荐的身份验证方法使其工作:

builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme);

但是,使用 Negotiate 对我有用:

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();

最后,将我们的自定义IClaimsTranformation实现添加到服务中:

// Claim transformation
builder.Services.AddScoped<IClaimsTransformation, MyClaimsTransformation>();

过去,必须在ConfigureServices()方法内部完成

有关 IClaimsTransformation 的更多详细信息,请访问此处: https ://docs.microsoft.com/en-us/aspnet/core/security/authentication/claims?view=aspnetcore-6.0

于 2022-02-23T21:36:34.013 回答