使用Windows身份验证的ASP.NET Core 6 Web API

wrrgggsh  于 2023-03-04  发布在  .NET
关注(0)|答案(1)|浏览(281)

我正在寻找一些帮助实现Windows身份验证/授权在.NET核心6。我找不到任何关于这个主题的好视频,并计划使一个一旦我完成这个项目。
我找到了以下文档https://learn.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-7.0&tabs=visual-studio
并实现了这个代码:

using Microsoft.AspNetCore.Authentication.Negotiate;

var builder = WebApplication.CreateBuilder(args);

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

builder.Services
       .AddAuthorization(options =>
              {
                  options.FallbackPolicy = options.DefaultPolicy;
              });

现在,这是实现了,我似乎找不到我会指定哪些用户被允许访问网站。我想这样的设置,所以没有用户登录,但只要他们使用的windows帐户是正确的组的一部分,他们可以访问网站的一部分,是为该组设置。
到目前为止,我唯一需要保护的是一个Web API,但是在未来也会有一个前端来保护(可能是Blazor)。
有人能给我介绍一下实现这个的教程吗?或者告诉我如何设置这个?

yruzcnhs

yruzcnhs1#

有人能给我介绍一下实现这个的教程吗?或者告诉我如何设置这个?
根据描述,我建议您可以创建一个声明传输类来查询角色,并在使用windows身份验证时将其添加到声明中。
然后,您可以直接使用"授权角色"属性,仅允许特定组使用该控制器。
更多细节,您可以参考以下代码:

public class ClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var ci = (ClaimsIdentity)principal.Identity;
        var re = ci.Claims.Where(x => x.Type == ClaimTypes.GroupSid || x.Type == ClaimTypes.PrimaryGroupSid).ToList();
        foreach (var item in re)
        {
            string account = new System.Security.Principal.SecurityIdentifier(item.Value).Translate(typeof(System.Security.Principal.NTAccount)).ToString();
            var roleClaim = new Claim(ClaimTypes.Role, account);
            ci.AddClaim(roleClaim);
        }
        return Task.FromResult(principal);
    }
}

将其注入program.cs中

builder.Services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();

用法:

[Authorize(Roles = "NT AUTHORITY\\Local account and member of Administrators group")]
    [HttpPost("WindowsAuthTest")]
    public IActionResult WindowsAuthTest()

相关问题