Que dois-je revenir de ma couche de service? DotNetOpenAuth
-
11-10-2019 - |
Question
Je me demande ce que dois-je retourner dans ce cas. Mon Ui et la couche de service sont dans différents projets.
Voici ce qui se passe
-> utilisateur arrive sur le site -> L'utilisateur choisit fournisseur OpenID et coups de connexion -> Revenir au contrôleur
[HttpPost]
public ActionResult Login(LoginViewModel loginViewModel)
{
var test = accountService.SendOpenIdRequest(loginViewModel.OpenId);
}
public class LoginViewModel
{
public OpenId OpenId { get; set; }
}
Alors je prends dans un ViewModel qui contient ma classe de domaine.
public class OpenId
{
public string Url { get; set; }
}
Jusqu'à présent, dans mon 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;
}
Maintenant, c'est là que je me perds depuis leur a tant de choses que je pourrais revenir.
Je pourrais revenir
return req.RedirectingResponse.AsActionResult()
Cependant, je pense que ce serait mauvais que maintenant je dépendais asp.net mvc ActionResult et si je dis utiliser cette couche de service pour un autre projet (peut-être j'ai un webservice qui se connecte à une application mobile). Il ne sera pas ne fonctionnera pas à bien.
Je pourrais return OutgoingWebResponse
mais je ne suis pas vraiment sûr de ce qu'il faut faire avec elle une fois que je le récupérer.
Je pourrais aussi revenir le IAuthenticationRequest ce qui est généré à partir createRequest ()
Enfin, je pourrais retourner mon objet Domaine (OpenId) avec l'un de ceux que j'énumérés ci-dessus en elle.
La solution
Vous pourriez retourner 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;
}
}
puis dans votre contrôleur:
[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();
}