[英]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.