Мы используем IdentityServer для обработки SSO-аутентификации в наших приложениях.
Мое приложение представляет собой веб-сайт As pnet core 3.0, который передает токены пользователя на javascript. Затем javascript вызывает отдельный as pnet 2.2 API.
Проблема: выход пользователя из системы и обратно не приводит к обновлению ClaimsPrincipal в API с новыми утверждениями.
Я подтвердил, что в веб-приложении есть новые заявки.
Если я вхожу в систему в режиме инкогнито или очищаю файлы cookie, новая заявка появляется в API.
Я не уверен, где ответственность за получение претензий должна быть и как это исправить. Я предполагаю, что утверждения являются частью зашифрованного access_token, поэтому я предполагаю, что веб-приложение отправляет устаревший access_token в API. Так что же мне нужно исправить в веб-приложении? И что было бы правильным исправлением?
Код запуска Api
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "Bearer";
options.DefaultChallengeScheme = "Bearer";
})
.AddJwtBearer(options =>
{
options.Authority = oidcSettings.Authority;
options.Audience = oidcSettings.ApplicationName;
options.RequireHttpsMetadata = true;
});
Код запуска веб-приложения
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext => { cookieContext.CookieOptions.SameSite = SameSiteMode.None; };
options.OnDeleteCookie = cookieContext =>
{
cookieContext.CookieOptions.SameSite = SameSiteMode.None; // this doesn't appear to get called.
};
});
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
}).AddCookie("Cookies", options =>
{
options.SlidingExpiration = false;
options.ExpireTimeSpan = TimeSpan.FromHours(8);
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = oidcSettings.Authority;
options.RequireHttpsMetadata = true;
options.ClientId = oidcSettings.ClientId;
options.ClientSecret = oidcSettings.ClientKey;
options.ResponseType = OpenIdConnectResponseType.Code;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("offline_access");
options.Scope.Add(oidcSettings.ApplicationName);
options.ClaimActions.MapJsonKey("role", "role"); // claims I am looking for are mapped here
options.Events.OnUserInformationReceived = async (context) =>
{
await Task.CompletedTask; // confirmed that after new sign in I can see updated info here.
};
});
TL; DR: Javascript из веб-приложения вызывает Api с помощью access_token. Когда пользователь выходит из системы и снова входит в систему, API не получает обновленные заявки. Я не уверен, что проблема в том, что API должен вызывать сервер идентификации для получения информации о пользователе, или веб-приложение не выходит из системы должным образом и ему необходимо отправить fre sh access_token?