https://stackoverflow.com/a/51671887/4058784

перебрал ссылкиВот, Вот а такжеВот которые связаны с проблемой, которую я имею.

У меня есть приложение Silverlight, использующее IdentiServer3 для аутентификации, и у меня появилась эта проблема только сейчас, когда я реализовал функцию выхода из системы. Обратите внимание, что проблема не имеет ничего общего с Silverlight, поскольку функциональность входа и выхода фактически реализована на стороне сервера, которая является классической веб-формой ASP.Net. (.NET 4.5.1)

Приложение никогда не имело функции выхода из системы, поэтому пользователь просто закрывал браузер, поэтому мы никогда раньше не сталкивались с этой проблемой. Теперь у нас есть страница logout.aspx, а приложение Silverlight имеет ссылку на эту страницу.

Страница выхода из системы .aspx

public partial class Logout : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)
        {
            Session.Clear();
            Request.GetOwinContext().Authentication.SignOut();
        }
        Response.Redirect("/");
    }
}

Страница Default.aspx. Это стартовая страница

public partial class Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Send an OpenID Connect sign-in request.
        if (!System.Web.HttpContext.Current.Request.IsAuthenticated)
        {
            HttpContext.Current.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
        }
    }
} 

OWIN класс запуска, где настроено соединение OpenID

  app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            LoginPath = new Microsoft.Owin.PathString("/Default.aspx")
        });

  app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["Authority"],
            Scope = "openid profile",
            ClientId = ConfigurationManager.AppSettings["ClientId"],
            RedirectUri = ConfigurationManager.AppSettings["RedirectUri"],
            ResponseType = "id_token",
            SignInAsAuthenticationType = "Cookies",

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                SecurityTokenValidated = (context) =>
                {

                    var id = context.AuthenticationTicket.Identity;

                    // create new identity
                    var newIdentity = new ClaimsIdentity(id.AuthenticationType);

                    // we want to keep username and subjectid                        
                    var sub = id.FindFirst(ClaimTypes.NameIdentifier);
                    var username = id.FindFirst("preferred_username");
                    newIdentity.AddClaim(username);
                    newIdentity.AddClaim(sub);

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

                    context.AuthenticationTicket = new AuthenticationTicket(
                        newIdentity,
                        context.AuthenticationTicket.Properties);

                    return Task.FromResult(0);
                },

                RedirectToIdentityProvider = (context) =>
                {
                    if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                    {
                        var idTokenHint = context.OwinContext.Authentication.User.FindFirst("id_token").Value;
                        context.ProtocolMessage.IdTokenHint = idTokenHint;
                    }
                    return Task.FromResult(0);
                },                    
            }

Шаги, чтобы воспроизвести проблему:

Я набираю URL веб-сайта, который перенаправляет меня на страницу входа в identityserver3.Я ввожу учетные данные и нажимаю логин.После успешного входа в систему меня перенаправляют на веб-сайт и там нажимают кнопку «Выйти».

Я успешно вышел из системы. Fiddler показывает следующие звонки

https://idsvr.mydomain.com/identity/connect/endsession?id_token_hint=XXXXXXXXXXXXXX https://idsvr.mydomain.com/identity/logout?id=616dd9a4e4c6a55b0bb27faceb4df8dd https://idsvr.mydomain.com/identity/connect/endsessioncallback?sid=xxxxxx

Я приземляюсь наhttps://idsvr.mydomain.com/identity/logout?id=xxxxxxx страница, как и ожидалось.

Теперь я закрываю браузер (этот шаг важен)Теперь снова введите URL веб-сайта, который перенаправляет меня на страницу входа на сервер идентификации. (как Шаг 1)Я ввожу учетные данные и нажимаю логин.После успешного входа в систему IdentityServer отправляет POST на веб-сайт, а веб-сайт создает AuthenticationTicket. Однако здесьHttpContext.Current.Request.IsAuthenticated так ложноDefault.aspx страница перенаправляет на IdentityServer. Я уже вошел в систему, поэтому Indetityserver перенаправляет на веб-сайт клиента, и циклы продолжаются.

Fiddler показывает несколько циклов перехода от identityServer к странице default.aspx веб-сайта. Каждая поездка туда и обратно добавляетOpenIdConnect.nonce.OpenIdConnect cookie и в конечном итоге я получаю ошибку неверного запроса из-за максимального размера запроса.

Так как предложено в приведенных выше ссылках, я понизилMicrosoft.Owin.Security.OpenIdConnect в3.0.0 в клиентском приложении.

Тем не менее, я все еще застреваю в непрерывном цикле. Разница лишь в том, что теперь он не добавляет новыхOpenIdConnect.nonce.OpenIdConnect печенье для каждой поездки туда и обратно. Fiddler показывает только один файл cookie для каждой поездки в оба конца. тем не мениеHttpContext.Current.Request.IsAuthenticated все еще ложь. Так что я застреваю в непрерывном цикле.

Ответы на вопрос(2)

Ваш ответ на вопрос