JwtAuthentication отключен Идентификационный логин - PullRequest
0 голосов
/ 09 мая 2019

Итак, я добавил аутентификацию Jwt в свой проект ASP.NET Core.Проект имеет два способа взаимодействия:

1) Непосредственное использование веб-сервиса.Использует контроллер MVC для доступа и перемещения вещей.

2) Отдельный клиент.

Я добавил JWT для клиента, чтобы позволить генерацию токена и запрашивать его по запросам клиента.

На стороне клиента это работает.Тем не менее, он был сломан на стороне веб-службы.Я использую Bootstrap4, и теперь я не могу войти, используя веб-страницы.

Вот части Startup.cs:

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 позволит мне войти в систему и делать все, что я захочу.Но проблема в том, что он не будет правильно аутентифицировать клиентскую программу.

Есть ли способ разрешить аутентификацию входа в Bootstrap4 с использованием метода аутентификации Jwt?

Примечание: по умолчанию _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)) никогда не возвращает true после того, как я включаю аутентификацию.

1 Ответ

0 голосов
/ 09 мая 2019

Очевидно, что лучше НЕ проверять подлинность с использованием Jwt Authentication из-за головной боли при передаче токенов по всему сайту, что делает его очень трудным.

Я нашел эту статью , в которой описано, как использовать обе схемы аутентификации.

В основном я заменил этот код:

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

...