У меня есть решение на C #, состоящее из:
- Приложение IdentityServer 4
- .net core 2.2 Web API
- React SPA
Я вхожу через приложение React, используя поток паролей владельца ресурса Identity Servers. Это работает, и я получаю токен доступа обратно.
Затем я вызываю метод в веб-интерфейсе API, передавая токен доступа:
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<VMFranchiseGeoJson> GetByAuthorizedUser()
{
try
{
var token = Context.Request.Headers["Authorization"];
var user = (Context.User.Identity as ClaimsIdentity);
...
При первом входе в систему после входа в систему это работает нормально, и токен содержит токен Bearer и Context.User. Личность содержит претензии. Однако, если я перезагружаю / обновляю страницу, выполняющую этот вызов, она работает в первый или даже несколько раз (кажется, не по истечении заданного интервала и довольно быстро теряет заголовки 2-3 минуты), а затем перестает работатьт.е. заголовок авторизации больше не существует.
Но ...
Он передается при вызове API, например, 'авторизация: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzMDg5OTk1YmJkNWVlY2 ... 10 * 10 *' 10 ** Я использую CORS здесь, поскольку это локальная разработка, но я настроил его следующим образом:
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
Вам нужно каким-то образом их сохранить?
Пробовал несколько решений, меняя политики CORS,переписать часть Identity Server, изменить потоки и т. д.
Редактировать для auth config @Alpha:
services.AddMvcCore().AddRazorViewEngine().AddAuthorization();
//services.AddAuthentication("Bearer")
// .AddIdentityServerAuthentication(options =>
// {
// options.Authority = "http://localhost:5000";
// options.RequireHttpsMetadata = false;
// options.ApiName = "api";
// });
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.Audience = "api";
});