Как 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 шт):

Автор решения: Andrei Brizhak

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

→ Ссылка