예제 #1
0
        public new void ProcessRequest(HttpContext context)
        {
            try
            {
                // ***** RESPONSE *****
                if (!String.IsNullOrEmpty(context.Request[HttpBindingConstants.SAMLResponse]))
                {
                    // Recupera Response
                    string      samlresponse = context.Request[HttpBindingConstants.SAMLResponse];
                    XmlDocument doc          = new XmlDocument();
                    doc.PreserveWhitespace = true;
                    doc.LoadXml(samlresponse);

                    // Verifica Signature do Response
                    if (XmlSignatureUtils.VerifySignature(doc))
                    {
                        SAMLResponse = SAMLUtility.DeserializeFromXmlString <ResponseType>(doc.InnerXml);
                        if (SAMLResponse.Items.Length > 0)
                        {
                            for (int i = 0; i < SAMLResponse.Items.Length; i++)
                            {
                                if (SAMLResponse.Items[i] is AssertionType)
                                {
                                    NameIDType    nameID    = null;
                                    AssertionType assertion = (AssertionType)SAMLResponse.Items[i];
                                    for (int j = 0; j < assertion.Subject.Items.Length; j++)
                                    {
                                        if (assertion.Subject.Items[j] is NameIDType)
                                        {
                                            nameID = (NameIDType)assertion.Subject.Items[j];
                                        }
                                    }
                                    if (nameID != null)
                                    {
                                        SignHelper.AutenticarUsuarioDaRespostaDoSaml(nameID.Value);
                                    }
                                }

                                // Armazena dados do sistema emissor do Request
                                // em Cookie de sistemas autenticados
                                AddSAMLCookie(context);
                            }
                        }
                        context.Response.Redirect(HttpUtility.UrlDecode(context.Request[HttpBindingConstants.RelayState]), false);
                    }
                    else
                    {
                        throw new ValidationException("Não foi possível encontrar assinatura.");
                    }
                }
                // ***** REQUEST *****
                else if (!String.IsNullOrEmpty(context.Request[HttpBindingConstants.SAMLRequest]))
                {
                    throw new NotImplementedException();
                }
                else
                {
                    // Carrega as configurações do ServiceProvider
                    ServiceProvider         config = ServiceProvider.GetConfig();
                    ServiceProviderEndpoint spend  = SAMLUtility.GetServiceProviderEndpoint(config.ServiceEndpoint, SAMLTypeSSO.signon);

                    // Verifica configuração do ServiceProvider para signon
                    if (spend == null)
                    {
                        throw new ValidationException("Não foi possível encontrar as configurações do ServiceProvider para signon.");
                    }

                    // Verifica se usuário está autenticado, caso não envia um Resquest solicitando autenticação
                    if (!UsuarioWebIsValid())
                    {
                        SAMLRequest        = new SAMLAuthnRequest();
                        SAMLRequest.Issuer = config.id;
                        SAMLRequest.AssertionConsumerServiceURL = context.Request.Url.AbsoluteUri;

                        HttpRedirectBinding binding = new HttpRedirectBinding(SAMLRequest, spend.localpath);
                        binding.SendRequest(context, spend.redirectUrl);
                    }
                    else
                    {
                        HttpContext.Current.Response.Redirect(spend.localpath, false);
                        HttpContext.Current.ApplicationInstance.CompleteRequest();
                    }
                }
            }
            catch (ValidationException ex)
            {
                ErrorMessage(ex.Message);
            }
            catch (Exception ex)
            {
                ApplicationWEB._GravaErro(ex);

                ErrorMessage("Não foi possível atender a solicitação.");
            }
        }
예제 #2
0
    protected void Page_Load(object sender, EventArgs e)
    {
        #region Trace

        // Write a trace message
        if (Trace.IsEnabled)
        {
            if (HttpContext.Current.User != null)
            {
                Trace.Write("HttpContext.Current.User", HttpContext.Current.User.ToString());
                Trace.Write("HttpContext.Current.User.Identity", HttpContext.Current.User.Identity.ToString());
                if (HttpContext.Current.User.Identity is FormsIdentity)
                {
                    Trace.Write("HttpContext.Current.User.Identity.IsAuthenticated", HttpContext.Current.User.Identity.IsAuthenticated.ToString());
                    if (HttpContext.Current.User.Identity.IsAuthenticated)
                    {
                        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                        Trace.Write("FormsIdentity.Ticket.Name", id.Ticket.Name);
                        Trace.Write("FormsIdentity.Ticket.IssueDate", id.Ticket.IssueDate.ToString());
                    }
                }
            }
            else
            {
                Trace.Write("HttpContext.Current.User", "NULL");
            }
        }

        #endregion Trace

        try
        {
            // Verifica autenticação
            if (UserIsAuthenticated())
            {
                if ((!String.IsNullOrEmpty(Request[HttpBindingConstants.SAMLRequest])) &&
                    (!String.IsNullOrEmpty(Request[HttpBindingConstants.RelayState])))
                {
                    // Recupera Request
                    SAMLRequest = new SAMLAuthnRequest();
                    string request = HttpUtility.UrlDecode(Request[HttpBindingConstants.SAMLRequest]);
                    SAMLRequest.UnPackRequest(request.Replace(" ", "+"));

                    // Criação e configuração do Response
                    SAMLResponse = new ResponseType();
                    CreateSAMLResponse();

                    // Armazena dados do sistema emissor do Request
                    // em Cookie de sistemas autenticados
                    AddSAMLCookie();
                }
                else
                {
                    throw new ValidationException("Não foi possível atender a solicitação, requisição inválida.");
                }
            }
            else //Autenticar com SAML no CoreSSO
            {
                if (Request.QueryString.AllKeys.Contains("RelayState") &&
                    !String.IsNullOrWhiteSpace(Request.QueryString["RelayState"].ToString()) &&
                    Request.QueryString["RelayState"].ToString().Split('?').Count() > 1 &&
                    Request.QueryString["RelayState"].ToString().Contains("RedirectUrlSAML")
                    )
                {
                    string redirectUrlSAML = Request.QueryString["RelayState"].ToString().Split('?')[1];
                    Response.Redirect("~/Login.ashx?" + redirectUrlSAML, false);
                }
                else
                {
                    throw new ValidationException("Não foi possível atender a solicitação, configuração da RedirectUrlSAML inválida.");
                }
            }
        }
        catch (ValidationException ex)
        {
            __SessionWEB.PostMessages = UtilBO.GetErroMessage(ex.Message, UtilBO.TipoMensagem.Alerta);
            Response.Redirect("~/Sistema.aspx", false);
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
        catch (Exception ex)
        {
            ApplicationWEB._GravaErro(ex);

            __SessionWEB.PostMessages = UtilBO.GetErroMessage("Não foi possível atender a solicitação.", UtilBO.TipoMensagem.Erro);
            Response.Redirect("~/Sistema.aspx", false);
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
    }
예제 #3
0
        public new void ProcessRequest(HttpContext context)
        {
            #region Trace

            // Write a trace message
            if (Trace.IsEnabled)
            {
                if (context.User != null)
                {
                    Trace.Write("context.User", context.User.ToString());
                    Trace.Write("context.User.Identity", context.User.Identity.ToString());
                    if (context.User.Identity is FormsIdentity)
                    {
                        Trace.Write("context.User.Identity.IsAuthenticated", context.User.Identity.IsAuthenticated.ToString());
                        if (context.User.Identity.IsAuthenticated)
                        {
                            FormsIdentity id = (FormsIdentity)context.User.Identity;
                            Trace.Write("FormsIdentity.Ticket.Name", id.Ticket.Name);
                            Trace.Write("FormsIdentity.Ticket.IssueDate", id.Ticket.IssueDate.ToString());
                        }
                    }
                }
                else
                {
                    Trace.Write("context.User", "NULL");
                }
            }

            #endregion Trace

            try
            {
                //// Verifica autenticação
                if (UserIsAuthenticated())
                {
                    if ((!String.IsNullOrEmpty(context.Request[HttpBindingConstants.SAMLRequest])) &&
                        (!String.IsNullOrEmpty(context.Request[HttpBindingConstants.RelayState])))
                    {
                        // Recupera Request
                        SAMLRequest = new SAMLAuthnRequest();
                        string request = HttpUtility.UrlDecode(context.Request[HttpBindingConstants.SAMLRequest]);
                        SAMLRequest.UnPackRequest(request.Replace(" ", "+"));

                        // Criação e configuração do Response
                        SAMLResponse = new ResponseType();
                        CreateSAMLResponse(context);

                        // Armazena dados do sistema emissor do Request
                        // em Cookie de sistemas autenticados
                        AddSAMLCookie(context);
                    }
                    else
                    {
                        throw new ValidationException("Não foi possível atender a solicitação, requisição inválida.");
                    }
                }
                else
                {
                    throw new ValidationException("Não foi possível atender a solicitação, o usuário não tem permissão de acesso ao sistema.");
                }
            }
            catch (ValidationException ex)
            {
                retorno.Mensagem = UtilBO.GetErroMessage(ex.Message, UtilBO.TipoMensagem.Alerta);
                UtilBO.MessageJSON(this.Context.Response.Output, retorno);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }
            catch (Exception ex)
            {
                ApplicationWEB._GravaErro(ex);
                retorno.Mensagem = UtilBO.GetErroMessage("Não foi possível atender a solicitação.", UtilBO.TipoMensagem.Erro);
                UtilBO.MessageJSON(this.Context.Response.Output, retorno);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }
        }