Обновить заявки после входа в систему с помощью identityserver3 2.1.1

Нам нужно обновить претензии пользователей после того, как они войдут на наш сайт. Это вызвано изменениями в пользовательских лицензиях, сделанных другой частью нашей системы.

Однако я не могу понять, как обновить претензии без выхода из системы / входа в систему.

Теперь это наша настройка клиента

 app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            //user validation host
            Authority = UrlConstants.BaseAddress,

            //Client that the user is validating against
            ClientId = guid,//if not convertet to Gui the compare from the server fails
            RedirectUri = UrlConstants.RedirectUrl,
            PostLogoutRedirectUri = UrlConstants.RedirectUrl,
            ResponseType = "code id_token token",
            Scope = "openid profile email roles licens umbraco_api umbracoaccess",

            UseTokenLifetime = false,
            SignInAsAuthenticationType = "Cookies",
            Notifications = new OpenIdConnectAuthenticationNotifications
            {

                SecurityTokenValidated = async n =>
                {
                    _logger.Info("ConfigureAuth", "Token valdidated");

                    var id = n.AuthenticationTicket.Identity;
                    var nid = new ClaimsIdentity(
                               id.AuthenticationType,
                               Constants.ClaimTypes.GivenName,
                               Constants.ClaimTypes.Role);

                    // get userinfo data
                    var uri = new Uri(n.Options.Authority + "/connect/userinfo");
                    var userInfoClient = new UserInfoClient(uri,n.ProtocolMessage.AccessToken);
                    var userInfo = await userInfoClient.GetAsync();
                    userInfo.Claims.ToList().ForEach(ui => nid.AddClaim(new Claim(ui.Item1, ui.Item2)));

                    var licens = id.FindAll(LicenseScope.Licens);
                    nid.AddClaims(licens);

                    // keep the id_token for logout
                    nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

                    n.AuthenticationTicket = new AuthenticationTicket(
                        nid,
                        n.AuthenticationTicket.Properties);
                    _logger.Info("ConfigureAuth", "AuthenticationTicket created");



                },

                RedirectToIdentityProvider = async n =>
                {
                    // if signing out, add the id_token_hint
                    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                    {
                        var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token").Value;
                        _logger.Debug("ConfigureAuth", "id_token for logout set on request");
                        _logger.Debug("ConfigureAuth", "Old PostLogoutRedirectUri: {0}", n.ProtocolMessage.PostLogoutRedirectUri.ToString());
                        n.ProtocolMessage.IdTokenHint = idTokenHint;

                        var urlReferrer = HttpContext.Current.Request.UrlReferrer.ToString();
                        if (!urlReferrer.Contains("localhost"))
                        {
                            n.ProtocolMessage.PostLogoutRedirectUri = GetRedirectUrl();
                        }
                        else
                        {
                            n.ProtocolMessage.PostLogoutRedirectUri = urlReferrer;
                        }

                        _logger.Debug("ConfigureAuth", string.Format("Setting PostLogoutRedirectUri to: {0}", n.ProtocolMessage.PostLogoutRedirectUri.ToString()));
                    }
                    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.AuthenticationRequest)
                    {
                        n.ProtocolMessage.RedirectUri = GetRedirectUrl2();
                        n.ProtocolMessage.AcrValues = GetCurrentUmbracoId();
                        _logger.Debug("ConfigureAuth", string.Format("Setting RedirectUri to: {0}", n.ProtocolMessage.RedirectUri.ToString()));
                    }
                },


            }
        });

Мы получаем наши пользовательские претензии в SecurityTokenValidated

 var licens = id.FindAll(LicenseScope.Licens);
                    nid.AddClaims(licens);

Я не понимаю, как получить это, не делая логин? Любая помощь высоко ценится.

1 ответ

Решение

Это напоминание о том, что вы не должны помещать утверждения в токены, которые могут измениться в течение срока действия сеанса.

Тем не менее, вы можете установить новый файл cookie в любой момент времени.

Зайдите в диспетчер аутентификации OWIN и вызовите метод SignIn. Передайте идентификационные данные утверждений, которые вы хотите сериализовать, в файл cookie.

например

Request.GetOwinContext().Authentication.SignIn(newIdentity);

Другие вопросы по тегам