Поставщик OAuth2.0 в Identity Server 4 - PullRequest
0 голосов
/ 31 января 2020

Я использую IdentityServer4 для федерации аутентификации для моих пользователей через AD и внешнего поставщика OAuth2.0.

В настоящее время я изменяю Быстрый запуск внешних поставщиков. Все внешние поставщики перенаправляются на один метод обратного вызова, в котором предполагается, что для SignInScheme задано значение «IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme».

Поэтому я настроил своих внешних поставщиков для использования этой схемы.

/ startup.cs

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                .AddAzureAD(options =>
                {
                    options.ClientId = Configuration["Authentication:Microsoft:ClientId"];
                    options.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
                    options.TenantId = "...";
                    options.CallbackPath = "/signin-oidc";
                    options.Instance = "https://login.microsoftonline.com/";
                    options.CookieSchemeName = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                })
                .AddCookie()
                .AddOAuth("myprovider", options =>
                {
                    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                    options.ClientId = "client_id";
                    options.ClientSecret = "client_secret";
                    options.CallbackPath = "/authorization-code/callback";
                    options.AuthorizationEndpoint = "http://localhost:3000/oauth2/authorize";
                    options.TokenEndpoint = "http://localhost:3000/oauth2/token";
                    options.Scope.Add("userinfo");

                });

Для AzureAD это работает нормально, и заявки, возвращенные из токена, сопоставляются. Однако для поставщика OAuth в методе Callback претензии не возвращаются.

/ ExternalController.cs

public async Task<IActionResult> Callback()
        {
            // read external identity from the temporary cookie
            var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
            if (result?.Succeeded != true)
            {
                throw new Exception("External authentication error");
            }

            if (_logger.IsEnabled(LogLevel.Debug))
            {
                var externalClaims = result.Principal.Claims.Select(c => $"{c.Type}: {c.Value}");
                _logger.LogDebug("External claims: {@claims}", externalClaims);
            }

Моему поставщику OAuth2.0 возвращается токен JWT Bearer из конечной точки токена , Если я добавлю пользовательское событие OnCreatingTicket, то я увижу, что токен доступа к контексту - это правильный токен, который я могу декодировать в JWT.io, однако утверждения не заполняются на Принципале.

options.Events.OnCreatingTicket = ctx =>
                    {
                        // externalClaims is empty
                        var externalClaims = ctx.Principal.Claims.Select(c => $"{c.Type}: {c.Value}");
                        // AccessToken is the encoded JWT.
                        String token = ctx.AccessToken;


                        return Task.CompletedTask;
                    };

Как я могу получить претензии от JWT, добавленные к Принципалу?

Спасибо!

...