Как JWT подключить?
Пытаюсь подключить к проекту JWT авторизацию вписал в startup:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Bearer";
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = true;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
// укзывает, будет ли валидироваться издатель при валидации токена
ValidateIssuer = true,
// строка, представляющая издателя
ValidIssuer = AuthOptions.ISSUER,
// будет ли валидироваться потребитель токена
ValidateAudience = true,
// установка потребителя токена
ValidAudience = AuthOptions.AUDIENCE,
// будет ли валидироваться время существования
ValidateLifetime = true,
// установка ключа безопасности
IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(),
// валидация ключа безопасности
ValidateIssuerSigningKey = true,
};
});
app.UseAuthentication();
app.UseAuthorization();
Выдача токена:
var now = DateTime.UtcNow;
// создаем JWT-токен
var jwt = new JwtSecurityToken(
issuer: AuthOptions.ISSUER,
audience: AuthOptions.AUDIENCE,
notBefore: now,
claims: identity.Claims,
expires: now.Add(TimeSpan.FromMinutes(AuthOptions.LIFETIME)),
signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256));
var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
var userAuth = new UserAuthViewModel()
{
Token = encodedJwt,
Username = identity.Name,
Image = string.Empty,
}; return userAuth;
Но когда в хедере: Authorization: Bearer *** Все равно авторизацию не проходит, что может быть не так?
Ответы (1 шт):
Недостаточно информации, чтобы попытаться решить проблему. Не ясно в какой в какой тип приложения из ASP.NET Core (Razor-pages, MVC, WEB-API) и для какой версии (.NET Core 3.2, .NET 5 или NET 6), вы добавляете авторизацию с помощью JWT токенов. Из тех фрагментов кода, которые вы представили, можно предположить, что проблема в том, что вы смешали в одном месте код из метода public void ConfigureServices(IServiceCollection services), который настраивает список сервисов доступных из контейнера DI и public void Configure(IApplicationBuilder app, IWebHostEnvironment env), в котором настраивается piplene по обработке запроса. Если использовать встроенную идентификацию Microsoft.AspNetCore.Identity, то я бы написал бы вот так:
для метода
public void ConfigureServices(IServiceCollection services)services.AddIdentity<IdentityUser,IdentityRole>() .AddDefaultTokenProviders().AddDefaultUI() .AddEntityFrameworkStores();
для метода
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)app.UseAuthentication(); app.UseAuthorization();
Вот здесь полный код работающего приложения со стандартной авторизацией и идентфикацие пользователей по ролям в ASP.Core MVC на .NET 5.
Но если вы пишете большое приложение с микро-сервисами с WebAPI, где необходима идентификация и авторизация не только пользователей, но самих микросервисов, то лучше использовать Duende Identity Server , вот здесь код с примером внедрения микросервисной архитектуры, где основное Веб приложение на ASP.NET Core MVC на NET 6, использует доступ к микросервисам с аутентификацией через Identity Server, используя Bearer токены.