Как я могу настроить аутентификацию по токену в ASP.NET Core, включая валидацию токена и генерацию токена для пользователя?
JWT токен может не проходить проверку на валидность по следующим причинам: 1. Истек срок действия токена - проверьте время жизни токена и его срок действия. 2. Неправильно сформированный токен - убедитесь, что токен был правильно подписан и содержит все необходимые данные. 3. Проблемы с ключом подписи - проверьте, что используемый ключ для подписи токена соответствует ключу, указанному при валидации токена. Чтобы настроить аутентификацию по токену в ASP.NET Core, включая валидацию и генерацию токена, вам необходимо выполнить следующие шаги: 1. Установите необходимые пакеты NuGet: ``` dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer ``` 2. В `Startup.cs` добавьте настройку аутентификации: ```csharp services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultchallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(options => { options.Authority = "https://your-domain"; options.Audience = "your-audience"; }); ``` 3. В контроллере добавьте атрибут `[Authorize]` для проверки аутентификации: ```csharp [Authorize] public class YourController : ControllerBase { // Код контроллера } ``` 4. Создайте генерацию токена для пользователя с помощью библиотеки, такой как `System.IdentityModel.Tokens.Jwt`. ```csharp var secret = "your-secret-key"; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: "your-issuer", audience: "your-audience", expires: DateTime.Now.AddHours(1), signingCredentials: credentials ); var tokenString = new JwtSecurityTokenHandler().WriteToken(token); ``` Подробнее о настройке аутентификации по токену в ASP.NET Core вы можете прочитать в официальной документации Microsoft: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-5.0
Я сам не понял как починил. Изменил я только конфигурацию (если точнее только переминовал "TokenNameInCookie" на "TokenNameInCookies" чтобы была привязка к свойству) и убрал лишнию "Bearer " в context.Token. Вот измененный код:
builder.Services.AddAuthentication(auth => { auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer((opts) => { opts.RequireHttpsMetadata = false, opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, //ValidIssuer = jwtOptions.Issuer, ValidateAudience = false, //ValidAudience = jwtOptions.Audience, ValidAlgorithms = new List<string> { jwtOptions.Algorithm }, ValidateIssuerSigningKey = true, IssuerSigningKey = jwtOptions.GetSymmetricSecurityKey(), ValidateLifetime = true, LifetimeValidator = (notBefore, expires, securityToken, validationParameters) => { if (expires != null) return expires.Value > DateTime.UtcNow; return false; }, //Тут пишуться валидные значения, чтобы потом аут через токен(проверка на валидность) }; opts.Events = new JwtBearerEvents { OnMessageReceived = async (context) => { if (context is not null && string.IsNullOrEmpty(context.Token) && context.Request.Cookies.ContainsKey(jwtOptions.TokenNameInCookies) && context.Request.Cookies.TryGetValue(jwtOptions.TokenNameInCookies, out var token)) { context.Token = token; } await Task.CompletedTask; } }; });
Токен ложу через Authorization header(swagger-ом), код отвечающий за то чтобы дать значение данному хеддеру я не изменял. И вот не понятно, почему раньше не работало когда в хеддере токен был а в куках нет?