Pregunta

Me pregunto lo que debería volver en este caso. Mi Ui y la capa de servicio se encuentran en diferentes proyectos.

Esto es lo que sucede

-> usuario llega al sitio -> El usuario elige el proveedor de OpenID y golpes que identificarte -> Mensaje de vuelta al controlador

 [HttpPost]
        public ActionResult Login(LoginViewModel loginViewModel)
        {
           var test = accountService.SendOpenIdRequest(loginViewModel.OpenId);

        }


public class LoginViewModel
    {
        public OpenId OpenId { get; set; }
    }

Así que tomo en un modelo de vista que contiene mi clase de dominio.

 public class OpenId
    {
        public string Url { get; set; }
    }

Hasta ahora, en mi SendOpenIdRequest

  public ?  SendOpenIdRequest(OpenId openId)
        {
            var openIdRelyingParty = new OpenIdRelyingParty();
            var response = openIdRelyingParty.GetResponse();

            Identifier id;
            if (Identifier.TryParse(openId.Url, out id))
            {
                try
                {
                    var req = openIdRelyingParty.CreateRequest(openId.Url);
                    return req.RedirectingResponse
                }
                catch (ProtocolException ex)
                {
                }
            }

            return null;
        }

Ahora aquí es donde me pierdo ya su son tantas cosas que podría regresar.

Me podría volver

return req.RedirectingResponse.AsActionResult()

Sin embargo creo que esto sería malo como ahora estoy dependiendo de asp.net mvc ActionResult y si digo utilizar esta capa de servicio para algún otro proyecto (tal vez tengo un servicio web que se conecta a una aplicación móvil). No lo hará no funcionará a bien.

Me podría return OutgoingWebResponse pero no estoy muy seguro de qué hacer con él una vez que consiga de nuevo.

También podría devolver el IAuthenticationRequest lo que se genera a partir de createRequest ()

Finalmente pude volver a mi objeto de dominio (OpenID) con uno de los que se enumeran más arriba en ella.

¿Fue útil?

Solución

Se podría devolver un OutgoingWebResponse:

public OutgoingWebResponse SendOpenIdRequest(OpenId openId)
{
    using (var openIdRelyingParty = new OpenIdRelyingParty())
    {
        var response = openIdRelyingParty.GetResponse();
        Identifier id;
        if (Identifier.TryParse(openId.Url, out id))
        {
            try
            {
                var req = openIdRelyingParty.CreateRequest(openId.Url);
                return req.RedirectingResponse
            }
            catch (ProtocolException ex)
            {
            }
        }
        return null;
    }
}

y luego en su controlador:

[HttpPost]
public ActionResult Login(LoginViewModel loginViewModel)
{
    var response = accountService.SendOpenIdRequest(loginViewModel.OpenId);
    if (response == null)
    {
        ModelState.AddModelError(
            "openid_identifier", 
            "The specified login identifier is invalid"
        );
        return View();
    }
    return response.AsActionResult();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top