Итак, я добавил аутентификацию 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 после того, как я включаю аутентификацию.