我想知道在这种情况下应该返回什么。我的Ui和服务层在不同的项目中。
这就是发生的事情
- >用户来到网站 - >用户选择openId提供程序并点击登录 - >回到控制器
[HttpPost]
public ActionResult Login(LoginViewModel loginViewModel)
{
var test = accountService.SendOpenIdRequest(loginViewModel.OpenId);
}
public class LoginViewModel
{
public OpenId OpenId { get; set; }
}
所以我接受了一个包含我的域类的ViewModel。
public class OpenId
{
public string Url { get; set; }
}
到目前为止,我的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;
}
现在这就是我迷失的地方,因为我可以回报这么多东西。
我可以回来了
return req.RedirectingResponse.AsActionResult()
但是我认为这会很糟糕,因为现在我依赖于asp.net mvc ActionResult,如果我说这个服务层用于其他项目(也许我有一个连接到移动应用程序的web服务)。它不会起作用。
我可以return OutgoingWebResponse
但是一旦我找回它,我不确定该怎么做。
我还可以返回从CreateRequest()
生成的IAuthenticationRequest最后,我可以使用上面列出的其中一个返回我的域对象(OpenId)。
答案 0 :(得分:0)
您可以返回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;
}
}
然后在你的控制器中:
[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();
}