很多天前,我问this question,我设置了一个有效的离线OpenID提供商(我猜)。
我想要的是一个简单的OpenID标识符登录文本框,它会自动接受用户并认为用户已登录,然后我希望他被重定向到主产品页面(Products => Index)。 / p>
但是,我不知道(并且没有在互联网上找到)的是如何在假身份验证过程之后继续。
我试着这样做:
[HttpPost]
public ActionResult Login(string openid)//openid is the identifier taken from the login textbox
{
var rely = new OpenIdRelyingParty();
var req = rely.CreateRequest(openid);
req.RedirectToProvider();
return RedirectToAction("Index", "Products");
}
首先,它没有被重定向到第4行(而是刷新登录页面),其次,没有经过身份验证的用户确实存在,我的意思是当我在Watch窗口中检查User
时,它是不是null但是Username是空的,没有经过身份验证的身份,我想这意味着没有设置cookie。
P.S:
1.没有例外。但是当我尝试调用FormsAuthentication.RedirectFromLogin()方法时,我得到一个异常(服务器无法在设置HTTP标头后修改cookie)。
2.索引操作方法标有[Authorize]属性,因此当有人试图浏览Products
时,它会被重定向到登录屏幕,但是当他登录时(假登录),不应该将其重定向回来到产品页面?
我也尝试了这个:
[HttpPost]
public ActionResult Login(string openid)
{
var rely = new OpenIdRelyingParty();
return rely.CreateRequest(openid).RedirectingResponse.AsActionResult();
}
但没有运气。
我错过了什么?以及如何使其按预期工作?我可以依靠自己,但我需要一个适合OpenID的文档,特别是对于离线本地提供商。
答案 0 :(得分:1)
选中此示例:OpenID and OAuth using DotNetOpenAuth in ASP.NET MVC
public ActionResult OpenId(string openIdUrl)
{
var response = Openid.GetResponse();
if (response == null)
{
// User submitting Identifier
Identifier id;
if (Identifier.TryParse(openIdUrl, out id))
{
try
{
var request = Openid.CreateRequest(openIdUrl);
var fetch = new FetchRequest();
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetch.Attributes.AddRequired(WellKnownAttributes.Name.First);
fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last);
request.AddExtension(fetch);
return request.RedirectingResponse.AsActionResult();
}
catch (ProtocolException ex)
{
_logger.Error("OpenID Exception...", ex);
return RedirectToAction("LoginAction");
}
}
_logger.Info("OpenID Error...invalid url. url='" + openIdUrl + "'");
return RedirectToAction("Login");
}
// OpenID Provider sending assertion response
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
var fetch = response.GetExtension<FetchResponse>();
string firstName = "unknown";
string lastName = "unknown";
string email = "unknown";
if(fetch!=null)
{
firstName = fetch.GetAttributeValue(WellKnownAttributes.Name.First);
lastName = fetch.GetAttributeValue(WellKnownAttributes.Name.Last);
email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
}
// Authentication
FormsAuthentication.SetAuthCookie(userName: email, createPersistentCookie: false);
// Redirection
return RedirectToAction("Index", "Products");
case AuthenticationStatus.Canceled:
_logger.Info("OpenID: Cancelled at provider.");
return RedirectToAction("Login");
case AuthenticationStatus.Failed:
_logger.Error("OpenID Exception...", response.Exception);
return RedirectToAction("Login");
}
return RedirectToAction("Login");
}
基本上,您的操作方法被调用两次:
用户首次提交表单。
第二次是来自OpenID提供商的回叫(重定向)。
这次,response
会有一个值。如果response.Status
有效,您可以使用FormsAuthentication
课程登录用户,最后您可以将其重定向到主要产品页面。