簡體   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