JWTauthentication禁用身份登录



所以我在我的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身份验证

相关内容

  • 没有找到相关文章

最新更新