Пример #1
0
        public new void ProcessRequest(HttpContext context)
        {
            try
            {
                // ***** REQUEST *****
                if (!String.IsNullOrEmpty(context.Request[HttpBindingConstants.SAMLRequest]))
                {
                    // Recupera LogoutRequest
                    StringBuilder result = new StringBuilder();

                    byte[]       encoded      = Convert.FromBase64String(HttpUtility.UrlDecode(context.Request[HttpBindingConstants.SAMLRequest]).Replace(" ", "+"));
                    MemoryStream memoryStream = new MemoryStream(encoded);
                    using (DeflateStream stream = new DeflateStream(memoryStream, CompressionMode.Decompress))
                    {
                        StreamReader reader = new StreamReader(new BufferedStream(stream), Encoding.GetEncoding("iso-8859-1"));
                        reader.Peek();
                        result.Append(reader.ReadToEnd());
                        stream.Close();
                    }
                    SAMLRequest = SAMLUtility.DeserializeFromXmlString <LogoutRequestType>(result.ToString());

                    AtribuirSessionSisIDLogout(((NameIDType)SAMLRequest.Item).Value);

                    // Criação e configuração LogoutResponse
                    SAMLResponse = new ResponseType();
                    CreateSAMLResponse();
                }
                // ***** RESPONSE *****
                else if (!String.IsNullOrEmpty(context.Request[HttpBindingConstants.SAMLResponse]))
                {
                    throw new NotImplementedException();
                }
                else
                {
                    AtribuirSessionSisIDLogout(String.Concat(ApplicationWEB._DiretorioVirtual, "Logout.ashx"));

                    __SessionWEB.SistemasRequestLogout++;

                    //Se existir link de retorno na primeira vez, significa que o sistema que iniciou o processo de logout
                    //enviou na queryString o endereço que deve ser redirecionado após terminar todo o processo.
                    if (!String.IsNullOrEmpty(context.Request["SistemaUrlLogout"]) && __SessionWEB.SistemasRequestLogout == 1)
                    {
                        __SessionWEB.SistemaUrlLogout_QueryString = context.Request["SistemaUrlLogout"];
                    }

                    // Verifica se existe sistemas autenticados em Cookie para realizar logout
                    HttpCookie cookie = context.Request.Cookies["SistemasLogged"];
                    if (cookie != null &&
                        cookie.Values.AllKeys.Count(p => p != null) > 0)
                    {
                        SYS_Sistema entitySistema = SYS_SistemaBO.GetEntity(new SYS_Sistema {
                            sis_id = Convert.ToInt32(cookie.Values.AllKeys.First())
                        });
                        HttpContext.Current.Response.Redirect(entitySistema.sis_caminhoLogout, false);
                        HttpContext.Current.ApplicationInstance.CompleteRequest();
                    }
                    else
                    {
                        HttpCookie cookieBH = context.Request.Cookies["BH"];
                        if (cookieBH != null &&
                            !String.IsNullOrEmpty(IdentitySettingsConfig.IDSSettings.LogoutUrlAVA))
                        {
                            HttpContext.Current.Response.Redirect(IdentitySettingsConfig.IDSSettings.LogoutUrlAVA, false);
                            HttpContext.Current.ApplicationInstance.CompleteRequest();
                        }
                        else
                        {
                            RedirecionarParaLogoutIdentityServer(context);
                        }
                    }
                }
            }
            catch (ValidationException ex)
            {
                ApplicationWEB._GravaErro(ex);
                //ErrorMessage(ex.Message);
                RedirecionarParaLogoutIdentityServer(context);
            }
            catch (Exception ex)
            {
                ApplicationWEB._GravaErro(ex);
                //ErrorMessage("Não foi possível atender a solicitação.");
                RedirecionarParaLogoutIdentityServer(context);
            }
        }