我一直在使用DoNetOpenAuth库,并遵循示例here
身份验证正在工作,但即使我需要一封电子邮件,claimsresponse也是空的。事实上,我需要什么并不重要,claimsresponse总是空的。不知道我做错了什么,我很感谢你的帮助。
提前谢谢。
这是我的登录按钮代码
protected void btnSubmit_Click( object sender, EventArgs e )
{
//Login button has been pushed. Add an extension and redirect
using (OpenIdRelyingParty openId = new OpenIdRelyingParty())
{
IAuthenticationRequest request = openId.CreateRequest( txtOpenID.Text );
request.AddExtension( new ClaimsRequest
{
Email = DemandLevel.Require,
Country = DemandLevel.Request,
TimeZone = DemandLevel.Request
} );
request.RedirectToProvider();
}
}下面是页面加载代码。但是,ClaimsResponse变量始终为空。
protected void Page_Load( object sender, EventArgs e )
{
OpenIdRelyingParty openId = new OpenIdRelyingParty();
var response = openId.GetResponse();
//check if we're processing a request
if(response != null)
{
switch ( response.Status )
{
case AuthenticationStatus.Authenticated:
//authentication worked. grab our required fields
var claimsResponse = response.GetExtension<ClaimsResponse>();
//TODO enter required fields into the database
break;
case AuthenticationStatus.Canceled:
//TODO handle cancel
break;
case AuthenticationStatus.Failed:
//TODO handle failed
break;
}
}
}发布于 2011-03-13 05:18:28
我在雅虎和谷歌都面临着同样的问题。然而,这个MVC示例在这个示例working Sample中工作得很好。当我试图将这个解决方案转换成普通的ASP.NET 2时,我就遇到了这个问题
protected void Page_Load(object sender, EventArgs e)
{
if (this.Request.HttpMethod == "POST")
{
var openid = new OpenIdRelyingParty();
string openid_identifier = this.openid_identifier.Text;
IAuthenticationRequest request = Openid.CreateRequest(Identifier.Parse(openid_identifier));
var fields = new ClaimsRequest();
fields.Email = DemandLevel.Require;
fields.FullName = DemandLevel.Require;
request.AddExtension(fields);
this.Response.ContentType = "text/html";
request.RedirectingResponse.Send();
return;
}
else
{
OpenIdRelyingParty openid = new OpenIdRelyingParty();
IAuthenticationResponse response = openid.GetResponse();
if (Request.Params["ReturnUrl"] != null)
Session["ReturnUrl"] = Request.Params["ReturnUrl"];
if (response != null && response.Status == AuthenticationStatus.Authenticated)
{
var claimUntrusted = response.GetUntrustedExtension<ClaimsResponse>();
var claim = response.GetExtension<ClaimsResponse>();
UserData userData = null;
if (claim != null)
{
userData = new UserData();
userData.Email = claim.Email;
userData.FullName = claim.FullName;
}
//now store Forms Authorisation cookie
IssueAuthTicket(userData, true);
//store ClaimedIdentifier it in Session
//(this would more than likely be something you would store in a database I guess
Session["ClaimedIdentifierMessage"] = response.ClaimedIdentifier;
//If we have a ReturnUrl we MUST be using forms authentication,
//so redirect to the original ReturnUrl
if (Session["ReturnUrl"] != null)
{
string url = Session["ReturnUrl"].ToString();
this.Response.Redirect(url,true);
return;
}
//This should not happen if all controllers have [Authorise] used on them
else
throw new InvalidOperationException("There is no ReturnUrl");
}
}
}发布于 2010-09-24 18:03:46
斯科特·汉瑟曼最近有一部podcast on DoNetOpenAuth。在播客中,DotNetOpenAuth的作者Scott Arnott声称谷歌的OAuth实现没有完全符合规范,并说它应该失败而不是返回null。
发布于 2010-09-23 23:50:17
事实证明,Google不会发回您请求的任何信息。他们将进行身份验证,但仅此而已。希望这篇文章能帮助其他人解决这个问题。
https://stackoverflow.com/questions/3129013
复制相似问题