Получение 401 несанкционированного доступа после использования токена носителя JWT ⇐ C#
Получение 401 несанкционированного доступа после использования токена носителя JWT
Я хочу создать аутентификацию и авторизацию для своего веб-API в .net 8.0.0 (что важно, учитывая, что в 7.0.0 в другом проекте я мог использовать носитель теми же методами, что описаны ниже), и я хотел для этого использовать токен JWT Bearer. У меня есть GetRequest с атрибутом авторизации, поэтому только авторизованные пользователи могут отправлять запросы, но это не работает. После входа в систему я успешно получаю токен, но когда я вставляю его (с помощью кнопки авторизации пользовательского интерфейса Swagger) и хочу использовать GetRequest, я получаю ошибку 401, есть идеи, почему?
У меня есть два файла, которые, как мне кажется, связаны между собой: один называется tokenservice, а другой — program.cs:
публичный класс TokenService: ITokenService { частная константа int ExpirationMinutes = 30; общедоступная строка CreateToken (пользователь IdentityUser) { var expiration = DateTime.UtcNow.AddMinutes(ExpirationMinutes); вар токен = CreateJwtToken( CreateClaims (пользователь), CreateSigningCredentials(), истечение срока действия ); вар tokenHandler = новый JwtSecurityTokenHandler (); вернуть tokenHandler.WriteToken(токен); } частный JwtSecurityToken CreateJwtToken (утверждения List, учетные данные SigningCredentials, срок действия DateTime) => новый JwtSecurityToken( "apiWithAuthBackend", "apiWithAuthBackend", претензии, истекает: срок действия, SigningCredentials: учетные данные ); частный список CreateClaims (пользователь IdentityUser) { пытаться { вар претензии = новый список { новое утверждение(JwtRegisteredClaimNames.Sub, "TokenForTheApiWithAuth"), новое утверждение (JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), новое утверждение(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString(CultureInfo.InvariantCulture)), новый Claim(ClaimTypes.NameIdentifier, user.Id ?? ""), новое утверждение(ClaimTypes.Name, user.UserName ?? ""), новая заявка(ClaimTypes.Email, user.Email ?? "") }; претензии по возврату; } поймать (Исключение e) { Console.WriteLine(e); бросать; } } частные SigningCredentials CreateSigningCredentials() { string secretKey = "!SomethingSecret!"; byte[] keyBytes = Encoding.UTF8.GetBytes(secretKey); // Обрезаем или дополняем ключ, чтобы его длина составляла ровно 32 байта Array.Resize(ref keyBytes, 32); вернуть новые SigningCredentials( новый SymmetricSecurityKey (keyBytes), SecurityAlgorithms.HmacSha256 ); } } var builder = WebApplication.CreateBuilder(args); // Добавляем сервисы builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddScoped(); builder.Services.AddDbContext(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddDbContext(параметры => { options.UseSqlServer(builder.Configuration.GetConnectionString("ProductDataContext")); }); // Добавляем личность builder.Services.AddIdentityCore(параметры => { options.SignIn.RequireConfirmedAccount = false; options.User.RequireUniqueEmail = true; options.Password.RequireDigit = false; options.Password.RequiredLength = 6; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireLowercase = false; }).AddEntityFrameworkStores(); // Настраиваем Сваггер builder.Services.AddSwaggerGen(опция => { option.SwaggerDoc("v1", new OpenApiInfo { Title = "Demo API", Version = "v1" }); option.AddSecurityDefinition("Носитель", новая OpenApiSecurityScheme { В = МестоположениеПараметра.Заголовок, Описание = "Пожалуйста, введите действительный токен", Имя = "Авторизация", Тип = ТипСхемыБезопасности.Http, Формат носителя = "JWT", Схема = "Носитель" }); option.AddSecurityRequirement(новый OpenApiSecurityRequirement { { новая схема OpenApiSecurityScheme { Ссылка = новая ссылка OpenApiReference { Тип=ReferenceType.SecurityScheme, Ид="Носитель" } }, новая строка[]{} } }); }); // Настраиваем аутентификацию строитель.Услуги .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(варианты => { options.TokenValidationParameters = новые TokenValidationParameters() { ClockSkew = TimeSpan.Zero, ValidateIssuer = правда, Валидатаудиенс = правда, ValidateLifetime = правда, ValidateIssuerSigningKey = true, ValidIssuer = "apiWithAuthBackend", ValidAudience = "apiWithAuthBackend", IssuerSigningKey = новый SymmetricSecurityKey( PadKey(Encoding.UTF8.GetBytes("!SomethingSecret!"), 32) ), }; }); вар приложение = builder.Build(); если (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); приложение.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); приложение.UseAuthentication(); приложение.UseAuthorization(); приложение.MapControllers(); приложение.Выполнить();
Я хочу создать аутентификацию и авторизацию для своего веб-API в .net 8.0.0 (что важно, учитывая, что в 7.0.0 в другом проекте я мог использовать носитель теми же методами, что описаны ниже), и я хотел для этого использовать токен JWT Bearer. У меня есть GetRequest с атрибутом авторизации, поэтому только авторизованные пользователи могут отправлять запросы, но это не работает. После входа в систему я успешно получаю токен, но когда я вставляю его (с помощью кнопки авторизации пользовательского интерфейса Swagger) и хочу использовать GetRequest, я получаю ошибку 401, есть идеи, почему?
У меня есть два файла, которые, как мне кажется, связаны между собой: один называется tokenservice, а другой — program.cs:
публичный класс TokenService: ITokenService { частная константа int ExpirationMinutes = 30; общедоступная строка CreateToken (пользователь IdentityUser) { var expiration = DateTime.UtcNow.AddMinutes(ExpirationMinutes); вар токен = CreateJwtToken( CreateClaims (пользователь), CreateSigningCredentials(), истечение срока действия ); вар tokenHandler = новый JwtSecurityTokenHandler (); вернуть tokenHandler.WriteToken(токен); } частный JwtSecurityToken CreateJwtToken (утверждения List, учетные данные SigningCredentials, срок действия DateTime) => новый JwtSecurityToken( "apiWithAuthBackend", "apiWithAuthBackend", претензии, истекает: срок действия, SigningCredentials: учетные данные ); частный список CreateClaims (пользователь IdentityUser) { пытаться { вар претензии = новый список { новое утверждение(JwtRegisteredClaimNames.Sub, "TokenForTheApiWithAuth"), новое утверждение (JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), новое утверждение(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString(CultureInfo.InvariantCulture)), новый Claim(ClaimTypes.NameIdentifier, user.Id ?? ""), новое утверждение(ClaimTypes.Name, user.UserName ?? ""), новая заявка(ClaimTypes.Email, user.Email ?? "") }; претензии по возврату; } поймать (Исключение e) { Console.WriteLine(e); бросать; } } частные SigningCredentials CreateSigningCredentials() { string secretKey = "!SomethingSecret!"; byte[] keyBytes = Encoding.UTF8.GetBytes(secretKey); // Обрезаем или дополняем ключ, чтобы его длина составляла ровно 32 байта Array.Resize(ref keyBytes, 32); вернуть новые SigningCredentials( новый SymmetricSecurityKey (keyBytes), SecurityAlgorithms.HmacSha256 ); } } var builder = WebApplication.CreateBuilder(args); // Добавляем сервисы builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddScoped(); builder.Services.AddDbContext(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddDbContext(параметры => { options.UseSqlServer(builder.Configuration.GetConnectionString("ProductDataContext")); }); // Добавляем личность builder.Services.AddIdentityCore(параметры => { options.SignIn.RequireConfirmedAccount = false; options.User.RequireUniqueEmail = true; options.Password.RequireDigit = false; options.Password.RequiredLength = 6; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireLowercase = false; }).AddEntityFrameworkStores(); // Настраиваем Сваггер builder.Services.AddSwaggerGen(опция => { option.SwaggerDoc("v1", new OpenApiInfo { Title = "Demo API", Version = "v1" }); option.AddSecurityDefinition("Носитель", новая OpenApiSecurityScheme { В = МестоположениеПараметра.Заголовок, Описание = "Пожалуйста, введите действительный токен", Имя = "Авторизация", Тип = ТипСхемыБезопасности.Http, Формат носителя = "JWT", Схема = "Носитель" }); option.AddSecurityRequirement(новый OpenApiSecurityRequirement { { новая схема OpenApiSecurityScheme { Ссылка = новая ссылка OpenApiReference { Тип=ReferenceType.SecurityScheme, Ид="Носитель" } }, новая строка[]{} } }); }); // Настраиваем аутентификацию строитель.Услуги .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(варианты => { options.TokenValidationParameters = новые TokenValidationParameters() { ClockSkew = TimeSpan.Zero, ValidateIssuer = правда, Валидатаудиенс = правда, ValidateLifetime = правда, ValidateIssuerSigningKey = true, ValidIssuer = "apiWithAuthBackend", ValidAudience = "apiWithAuthBackend", IssuerSigningKey = новый SymmetricSecurityKey( PadKey(Encoding.UTF8.GetBytes("!SomethingSecret!"), 32) ), }; }); вар приложение = builder.Build(); если (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); приложение.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); приложение.UseAuthentication(); приложение.UseAuthorization(); приложение.MapControllers(); приложение.Выполнить();
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение 401 несанкционированного ответа на вызов Apple Developer API
Anonymous » » в форуме Android - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-