Domanda

Mi chiedo che cosa devo tornare in questo caso. Il mio Ui e livello di servizio sono in diversi progetti.

Questo è ciò che accade

-> utente arriva al sito -> L'utente sceglie provider OpenID e colpisce il login -> Post torna al controllore

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

        }


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

Così prendo in un ViewModel che contiene la mia classe di dominio.

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

Finora nella mia 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;
        }

Ora, questo è dove mi perdo in quanto loro sono così tante cose che potrei tornare.

I potrebbe tornare

return req.RedirectingResponse.AsActionResult()

Tuttavia credo che questo sarebbe male come ora sto a seconda asp.net mvc ActionResult e se dico utilizzare questo livello di servizio per qualche altro progetto (forse ho un webservice che si connette a un'applicazione mobile). Non sarà non sarà lavoro per bene.

ho potuto return OutgoingWebResponse ma io non sono davvero sicuro di cosa fare con esso una volta che ottengo indietro.

Potrei anche tornare l'IAuthenticationRequest ciò che viene generato da CreateRequest ()

Finalmente ho potuto restituire il mio oggetto di dominio (OpenID) con uno di quelli che ho elencato sopra in esso.

È stato utile?

Soluzione

Si potrebbe restituire 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;
    }
}

e poi nel controllore:

[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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top