Как получить более свежую информацию о пользователе с помощью AddJwtBearer - PullRequest
0 голосов
/ 17 июня 2020

Мы используем 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?

...