Отображение пользовательского JSON в ClaimActions - PullRequest
0 голосов
/ 22 февраля 2020

Я занимаюсь разработкой веб-сайта на основе Angular, на котором пользователю необходимо войти в систему с помощью стороннего поставщика аутентификации OAuth2. . Net Базовый веб-API является бэкэндом. Ответ, полученный от конечной точки пользователя, имеет формат JSON и имеет следующий формат:

{
    "dataSources": {
        "profile": {
            "username": "xyz"
        }
    },
    "profile": {
        "id": "87dfkajdfd998df"
    },
    "errors": {}
}

Код, который я сейчас использую, выглядит следующим образом:

builder.AddOAuth(oauth2Configuration.Issuer,
options => {
    options.ClientId = oauth2Configuration.ClientId;
    options.ClientSecret = oauth2Configuration.ClientSecret;
    options.Scope.Add(oauth2Configuration.Scope); 
    options.ClaimsIssuer = oauth2Configuration.Issuer;
    options.CallbackPath = new PathString(oauth2Configuration.ResponseType);
    options.AuthorizationEndpoint = oauth2Configuration.Authority;
    options.TokenEndpoint = oauth2Configuration.EndSessionEndpoint;
    options.UserInformationEndpoint = oauth2Configuration.UserInfoEndpoint;
    options.SaveTokens = true;

    // Below mapping does not seem to work
    options.ClaimActions.MapJsonSubKey(ClaimTypes.Name, "dataSources", "profile.username");
    options.ClaimActions.MapJsonKey(ClaimTypes.SerialNumber, "profile.id");

    // Remaining code       
})

После при проверке подлинности с использованием приведенного выше кода список утверждений всегда пуст.

Кто-нибудь сталкивался с подобной ситуацией, в которой сопоставление утверждений выполнялось для пользовательских JSON данных?

1 Ответ

0 голосов
/ 24 февраля 2020

Кажется, что сам обработчик аутентификации OAuth не поможет вызвать конечную точку, вам нужно вручную сделать вызов для получения профиля использования из конечной точки UserInfo в OnCreatingTicket событии:

OnCreatingTicket = async context =>
{
    var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

    var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
    response.EnsureSuccessStatusCode();

    var user = JObject.Parse(await response.Content.ReadAsStringAsync());

    context.RunClaimActions(user);
}

и сделать заявку сопоставление вручную в зависимости от вашего сценария - проанализируйте / прочитайте json, используя JSON. NET, и добавьте к принципу пользователя. Пожалуйста, обратитесь к следующим статьям для примеров кода:

https://www.jerriepelser.com/blog/authenticate-oauth-aspnet-core-2/ { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...