OpenId Connect и Custom Identity Framework - PullRequest
       60

OpenId Connect и Custom Identity Framework

0 голосов
/ 31 января 2019

Я использую пример Okta для реализации OpenIdConnect в веб-приложении MVC Asp.NET 4.6.x.Приложение использует Unity для внедрения зависимостей, и одна из зависимостей - это пользовательский набор классов для Identity Framework.Я не использую Okta API, потому что IdP на самом деле не Okta, и я предполагаю, что в нем есть проприетарные вещи.Так что это все стандартные библиотеки .NET для частей OpenId.

Я могу пройтись по коду после нажатия кнопки входа в систему, и он перенесет меня в IdP, и я смогу войти в систему с моей учетной записью, а затем это принесет мненазад, и я могу видеть всю информацию от них для моего логина.Но он не регистрирует меня или что-то в этом роде, как в примере с GitHub от Okta.

По сути, мне интересно, является ли настройка идентификаторов тем, что мешает входу в систему, и есть ли способ попасть всередина этого и укажите, что мне нужно сделать?

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions {
            ClientId = clientId 
            , ClientSecret = clientSecret
            , Authority = authority
            , RedirectUri = redirectUri
            , AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Passive
            , ResponseType = OpenIdConnectResponseType.CodeIdToken
            , Scope = OpenIdConnectScope.OpenIdProfile
            , PostLogoutRedirectUri = postLogoutRedirectUri
            , TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" }
            , Notifications = new OpenIdConnectAuthenticationNotifications {
                AuthorizationCodeReceived = async n =>
                {
                    //var tokenClient = new TokenClient($"{authority}/oauth2/v1/token", clientId, clientSecret);
                    var tokenClient = new TokenClient($"{authority}/connect/token", clientId, clientSecret);
                    var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, redirectUri);

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

                    //var userInfoClient = new UserInfoClient($"{authority}/oauth2/v1/userinfo");
                    var userInfoClient = new UserInfoClient($"{authority}/connect/userinfo");
                    var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);
                    var claims = new List<System.Security.Claims.Claim>();
                    claims.AddRange(userInfoResponse.Claims);
                    claims.Add(new System.Security.Claims.Claim("id_token", tokenResponse.IdentityToken));
                    claims.Add(new System.Security.Claims.Claim("access_token", tokenResponse.AccessToken));

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

                    n.AuthenticationTicket.Identity.AddClaims(claims);

                    return;
                }
                , RedirectToIdentityProvider = n =>
                  {
                    // If signing out, add the id_token_hint
                    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
                    {
                          var idTokenClaim = n.OwinContext.Authentication.User.FindFirst("id_token");

                          if (idTokenClaim != null)
                          {
                              n.ProtocolMessage.IdTokenHint = idTokenClaim.Value;
                          }

                    }

                    return Task.CompletedTask;
                  }
                }
        });

1 Ответ

0 голосов
/ 12 марта 2019

Токены, возвращаемые Okta, должны управляться вашим приложением для выполнения действия входа в систему.Возвращенный токен OIDC должен быть проверен и подтвержден вами, а затем принято решение о том, принимать ли токен OIDC.Если это так, вы предпринимаете действия для входа пользователя в ваше приложение.Получение токена OIDC в ​​результате потока OpenID Connect само по себе не регистрирует вас в приложении.Приложению необходимо выполнить дополнительную работу на основе содержимого токена перед тем, как выполнить вход или отклонить действие.

...