繁体   English   中英

blazor webassembly wasm windows 身份验证/协商+ jwt? api保护

[英]blazor webassembly wasm windows authentication / negotiate+ jwt? api protection

我正在构建一些 blazor wasm 应用程序,我必须使用 windows autch,因为它仅适用于企业用户。 所以我有

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

我有一些用户控制器负责获取用户名。 现在我想保护整个 api ,所以用户不能使用我的 api(因为他们是域认证的),只有这个 WASM 应该能够在开发中使用这个 api 和招摇。

对此的最佳做法是什么? jwt 也? 只是为了 api 保护而不是纯粹的用户身份验证?

我确实生成了一些 jwt

    [HttpGet]
    [Authorize]
    [Route("GetUser")]
    public UserModel GetUser()
    {

        string? login =  httpContextAccessor!.HttpContext!.User?.Identity?.Name?.Replace("domain\\", "");

        return new UserModel{ UserName=login , JWT = CreateJWT(login)};
    }

    private string? CreateJWT(string? userName)
    {
        if (userName == null) return null;

        var secretkey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(this.appSettings.JWTSettings!.Secret!)); 
        var credentials = new SigningCredentials(secretkey, SecurityAlgorithms.HmacSha256);

        var claims = new[] 
        {
            new Claim(ClaimTypes.Name, userName), 
            new Claim(JwtRegisteredClaimNames.Sub, userName)
        };

        var token = new JwtSecurityToken(issuer: "xxx", audience: "xxx", claims: claims, expires: DateTime.Now.AddMinutes(int.Parse(this.appSettings.JWTSettings.ExpireTime!)), signingCredentials: credentials);
        return new JwtSecurityTokenHandler().WriteToken(token);
    }

}

但是如何强制 api 也检查这个 jwt 呢? 我试过了

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => 
{
options.TokenValidationParameters = new TokenValidationParameters
{
    ValidateAudience = true,
    ValidAudience = "xxx",
    ValidateIssuer = true,
    ValidIssuer = "xxx",
    ValidateLifetime = true,
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(a.JWTSettings.Secret!)) 
};
});

但这并没有改变任何东西。 该应用程序可以有两次builder.Services.AddAuthentication吗?

如果没有,那么我需要构建一些自定义中间件吗? 还是有更好的解决方案?

谢谢并恭祝安康

好的,对于未来的搜索者来说。 为此,我希望我们需要:

builder.Services.AddAuthentication((options) =>
{
options.DefaultAuthenticateScheme = "JwtBearer";
options.DefaultChallengeScheme = "JwtBearer";
}).AddJwtBearer(options =>
{
  options.TokenValidationParameters = new TokenValidationParameters
{
    ValidateAudience = true,
    ValidateIssuer = true,
    ValidIssuer = builder.Configuration["JWT:Issuer"],
    ValidAudience = builder.Configuration["JWT:Issuer"],
    ValidateLifetime = true,
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = new 
SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(builder.Configuration["JWT:Key"]))
};
}).AddNegotiate();

然后我加了

 builder.Services.AddAuthorization(options =>
 {    
  var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme);
  defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
  options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
 }); 

app.MapControllers().RequireAuthorization();

这个添加自动不可见

[Authorize(AuthenticationSchemes=JwtBearerDefaults.AuthenticationScheme)]

给我所有的控制器

最后仅用于生成此 jwt 并获取 Windows 用户名的 getUser 方法

[Authorize(AuthenticationSchemes = NegotiateDefaults.AuthenticationScheme)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM