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