Перенаправить не на Home / Index, а на сервер OpenIdConnectAuthentication и Identity после входа в систему

Я пытаюсь перенаправить пользователя на Dashboard, но он всегда перенаправляет его на Home / Index, потому что я установил RedirectUri на http://localhost:35641/ в параметрах сервера идентификации. Но это верно в случае, если целевая страница приложения после входа в систему должна перенаправить на панель управления. Я могу написать собственную логику в Результате действия Индекса, но я хочу избежать этого. Метод веб-запуска MVC

  public void Configuration(IAppBuilder app)
    {
                // Implicit mvc owin
                JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
                app.UseCookieAuthentication(new CookieAuthenticationOptions
                {
                    AuthenticationType = "Cookies"
                });
                app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
                {
                    ClientId = ApplicationConstants.ClientIdNucleusMvcApp,
                    Authority = ApplicationConstants.UrlBaseAuth,
                    RedirectUri = ApplicationConstants.UrlBaseWeb,
                    PostLogoutRedirectUri = ApplicationConstants.UrlBaseWeb,
                    ResponseType = "id_token token",
                    Scope = string.Format("openid email {0}", ApplicationScopes.MvcApp),
                    SignInAsAuthenticationType = "Cookies",

                    // sample how to access token on form (when adding the token response type)
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        SecurityTokenValidated = async n =>
                        {
                            // Adding access token in claims
                            var accessToken = n.ProtocolMessage.AccessToken;
                            if (!string.IsNullOrEmpty(accessToken))
                            {
                                n.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", accessToken));
                            }

                            // Adding identity token in claims
                            var identityToken = n.ProtocolMessage.IdToken;
                            if (!string.IsNullOrEmpty(identityToken))
                            {
                                n.AuthenticationTicket.Identity.AddClaim(new Claim("identity_token", identityToken));
                            }
                        },
                        RedirectToIdentityProvider = async n =>
                        {
                            // if signing out, add the id_token_hint
                            if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                            {
                                var idToken = n.OwinContext.Authentication.User.FindFirst("identity_token");
                                n.ProtocolMessage.IdTokenHint = idToken == null ? null : idToken.Value;
                                n.ProtocolMessage.PostLogoutRedirectUri = ApplicationConstants.UrlBaseWeb;
                            }
                        }
                    }
                });
            }

Вот мой клиент на сервере идентификации

 new Client
                {
                    Enabled = true,
                    ClientName = ApplicationConstants.ClientNameNucleusMvcApp,
                    ClientId = ApplicationConstants.ClientIdNucleusMvcApp,
                    ClientSecrets = new List<ClientSecret>
                    {
                        new ClientSecret(ApplicationConstants.ClientSecretNucleusMvcApp.Sha256())
                    },
                    Flow = Flows.Implicit,
                    RequireConsent = false,
                    AccessTokenType = AccessTokenType.Reference,
                    IdentityTokenLifetime = 1800,
                    AccessTokenLifetime = 1800,
                    RedirectUris = new List<string>
                    {
                        // MVC form post sample
                        ApplicationConstants.UrlBaseWeb,
                        ApplicationConstants.UrlBaseWeb + "Dashboard/Index"
                    },
                    PostLogoutRedirectUris = new List<string>
                    {
                        ApplicationConstants.UrlBaseWeb
                    }
                }

Помощь будет оценена. Спасибо


person Haris    schedule 11.09.2015    source источник


Ответы (1)


RedirectUri, который вы используете для разговора со своим авторитетом, не должен иметь значения, он просто используется для отправки токена обратно в ваше приложение. После этого существует внутреннее (== локальное для приложения) перенаправление, которое используется для установки файла cookie сеанса и может перемещаться куда угодно на сайте. Как вы запускаете аутентификацию? Если вы начали с защищенного действия с помощью [авторизовать], вы всегда должны вернуться туда в конце. Если вы используете код явного входа, например, если

HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);

вы всегда можете указать любой желаемый маршрут посадки в RedirectUri. Я знаю, это фантастически сбивает с толку, что свойство, управляющее этим внутренним перенаправлением, имеет то же имя, что и аналог протокола - единственное оправдание, которое у нас есть, состоит в том, что класс AuthenticationProperties уже существовал, когда было введено новое промежуточное ПО, основанное на утверждениях, и вызывает фактическое OAuth/OIDC redirect_uri с подчеркиванием не слетел с .NET-сообществом. HTH

person vibronet    schedule 11.09.2015