所以我在我的ASP.NET核心项目中添加了JWT身份验证。该项目有两种互动方式:
1(直接使用Web服务。使用MVC控制器访问和移动问题。
2(单独的客户端。
我为客户端添加了JWT,以允许代币生成并根据客户端请求要求。
对于客户端,它正在工作。但是,它在网络服务方面被打破了。我正在使用Bootstrap4,现在无法使用网页登录。
这是启动的部分:
private class ConfigureJwtBearerOptions : IPostConfigureOptions<JwtBearerOptions> {
private readonly IOptions<JwtAuthentication> _jwtAuthentication;
public ConfigureJwtBearerOptions(IOptions<JwtAuthentication> jwtAuthentication) {
_jwtAuthentication = jwtAuthentication ?? throw new System.ArgumentNullException(nameof(jwtAuthentication));
}
public void PostConfigure(string name, JwtBearerOptions options) {
var jwtAuthentication = _jwtAuthentication.Value;
options.ClaimsIssuer = jwtAuthentication.ValidIssuer;
options.IncludeErrorDetails = true;
options.RequireHttpsMetadata = true;
options.TokenValidationParameters = new TokenValidationParameters {
ValidateActor = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtAuthentication.ValidIssuer,
ValidAudience = jwtAuthentication.ValidAudience,
IssuerSigningKey = jwtAuthentication.SymmetricSecurityKey,
NameClaimType = ClaimTypes.NameIdentifier
};
}
}
然后我正在使用该私人类添加身份验证:
services.AddSingleton<IPostConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer();
最后,
app.UseAuthentication();
现在,如果我发表评论services.AddAuthentication(...).AddJwtBearer()
,我的网络服务将再次工作,Bootstrap4将允许我登录并做任何我想做的事情。但是问题在于它无法正确身份验证客户端程序。
有没有一种方法可以使用JWT身份验证方法对Bootstrap4登录进行身份验证?
注意:_loginpartial.cshtml默认为:
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
我启用身份验证后,条件@if (SignInManager.IsSignedIn(User))
永远不会返回。
显然最好不要使用JWT身份验证对身份进行身份验证,这是由于网站周围传递令牌的头痛,这非常困难。
我找到了这篇文章,该文章描述了如何制定认证方案。
基本上,我替换了此代码:
services.AddSingleton<IPostConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer();
与此:
services.AddSingleton<IPostConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>();
services.AddAuthentication()
.AddCookie(cfg => cfg.SlidingExpiration = true)
.AddJwtBearer(cfg => {
cfg.RequireHttpsMetadata = false;
cfg.SaveToken = true;
cfg.TokenValidationParameters = new TokenValidationParameters() {
ValidIssuer = Configuration["JwtAuthentication:ValidIssuer"],
ValidAudience = Configuration["JwtAuthentication:ValidAudience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtAuthentication:SecurityKey"]))
};
});
现在两个身份验证方案都在起作用。
在我的情况下,这是最好的解决方案,因为我有两个完全独立的控制器可以完成工作:
1(MVC控制器:使用身份身份验证
2(API控制器:使用JWT身份验证