Извлечь токен доступа из идентификатора претензий в OpenId Connect - PullRequest
0 голосов
/ 31 января 2020

Я использую OpenId Connect для аутентификации пользователя в одном из ASP. Net MVC приложений, над которыми я работаю. Я пытаюсь извлечь access_token в методе контроллера, чтобы сделать http-вызов с этим access_token в заголовке авторизации. Чтобы получить токен доступа, я преобразую свойство User.Identity в ClaimsIdentity, а затем пытаюсь найти конкретное утверждение, вызвав метод FindFirst, но он возвращает значение NULL. Требуемая конфигурация для OpenId Connect все в порядке и на месте.

Вот мой код для конфигурации OpenId в -

public void Configuration(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions());


            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
            {
                ClientId = clientId,
                ClientSecret = clientSecret,
                Authority = authority,
                RedirectUri = redirectUri,
                ResponseType = OpenIdConnectResponseType.CodeIdToken,
                Scope = OpenIdConnectScope.OpenIdProfile,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                Configuration = new OpenIdConnectConfiguration(configurationString),
                TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name"
                },
                SaveTokens = true,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthorizationCodeReceived = async n =>
                    {
                        // Exchange code for access and ID tokens
                        var tokenClient = new TokenClient(tokenUri, clientId, clientSecret);
                        var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, redirectUri);

                        if (tokenResponse.IsError)
                        {
                            throw new Exception(tokenResponse.Error);
                        }

                        var userInfoClient = new UserInfoClient(userInfoUri);
                        var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);
                        var claims = new List<Claim>();
                        claims.AddRange(userInfoResponse.Claims);
                        claims.Add(new Claim("id_token", tokenResponse.IdentityToken));
                        claims.Add(new Claim("access_token", tokenResponse.AccessToken));

                        if (!string.IsNullOrEmpty(tokenResponse.RefreshToken))
                        {
                            claims.Add(new Claim("refresh_token", tokenResponse.RefreshToken));
                        }

                        n.AuthenticationTicket.Identity.AddClaims(claims);

                        return;
                    },
                }
            )};
        }

Вот мой код метода Controller, где я я пытаюсь извлечь access_token

[Route("oauth/callback")]
[Authorize]
        public ActionResult Callback()
        {
            var claimsIdentity = User.Identity as ClaimsIdentity;

            // Extract tokens
            string accessToken = claimsIdentity?.FindFirst(c => c.Type == "access_token")?.Value;
            string idToken = claimsIdentity?.FindFirst(c => c.Type == "id_token")?.Value;

            return RedirectToAction("Index", "User");
        }

Две вещи здесь - 1. Когда вызывается этот метод, приложение перенаправляет на страницу входа, что означает, что атрибут Authorize не работает (я полагаю, что).

Без атрибута Authorize я могу отладить метод, но и accessToken, и idToken показывают нулевое значение при наведении на них указателя.

Пожалуйста, помогите. Любая помощь будет оценена.

Спасибо,

Амит Ананд

...