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