c# – DotNetOpenAuth:为什么我不会在给出电子邮件的情况下获得相同的OpenID?
作者:互联网
我试图使用OpenID /依赖方(Google,Yahoo!..)登录.我的登录页面如下.
我想做的很简单:
Get the OpenID from an user, store it, and associate it with an user account. Every time that unique OpenID is returned from the provider, I would know that the user associated is now logged in. Simple.
问题是我认为是OpenID的response.ClaimedIdentifier.OriginalString并不是唯一的.它几乎是独一无二的.大多数情况下返回的值是相同的,但有时,并非总是,由于某些原因(特别是更改的浏览器或计算机),此值会更改,我会为用户创建另一个帐户.
我究竟做错了什么?什么是必须存储的TRUE OpenID代码,无论浏览器还是计算机都是唯一的?
public partial class Pages_User_LoginOpenID : LivrePage
{
OpenIdRelyingParty relyingParty = new OpenIdRelyingParty();
IAuthenticationResponse response = null;
protected void Page_Load(object sender, EventArgs e)
{
response = relyingParty.GetResponse();
if (response != null)
{
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
// verifico se existe um usuário com este openid
OpenId openId = UserHelper.GetSession().CreateCriteria<OpenId>().Add(Expression.Eq("IdentifierString", response.ClaimedIdentifier.OriginalString)).UniqueResult<OpenId>();
if (openId == null)
{
openId = new OpenId();
openId.IdentifierString = response.ClaimedIdentifier.OriginalString;
// não existe usuário com este OpenId
User newUser = UserHelper.CreateUser(openId);
SecurityManager.Login(newUser.Id);
}
else
SecurityManager.Login(openId.User.Id);
Response.Redirect(UrlFactory.GetUrlForPage(UrlFactory.PageName.Home));
break;
default:
break;
}
}
}
// processes the login button click
protected void ButtonLogin_Click(object sender, EventArgs e)
{
if (response == null)
relyingParty.CreateRequest(TextBoxOpenID.Text).RedirectToProvider();
}
}
解决方法:
你很近,但在你的代码中略有偏差.唯一标识符不是response.ClaimedIdentifier.OriginalString,而只是response.ClaimedIdentifier. OriginalString略有不同,实际上它应该被标记为内部以避免混淆.尽管ClaimedIdentifier属于Identifier类型,但当您将其分配给字符串变量时,它实际上会自动成为字符串,因此不必担心.
现在关于拆分用户帐户.最有可能的问题是,OpenID称之为“定向身份”,这是OpenID提供商(在本例中为Google)为同一用户发送不同OpenID的地方,具体取决于IAuthenticationRequest.Realm属性的值.非常重要的是,您的网站必须确保Realm始终具有相同的值,以便Google每次都将您的网站识别为同一个网站,从而每次向同一用户发出相同的ClaimedIdentifier.
那可能会出现什么问题?如果您没有明确设置Realm值,DotNetOpenAuth会猜测它是您主页的URL.但这是基于请求的URL.例如,如果用户可以使用http://www.yoursite.com/和https://www.yoursite.com/访问您的网站(请注意https方案在第二个)然后两个都是合法的主页,DotNetOpenAuth将使用用户恰好访问您的登录页面的任何方案.同样,如果您的网站在http://yoursite.com和http://www.yoursite.com上都可用(请注意www),那么它也会成为两个不同的领域值.你需要做的是明确地设置领域,例如:
relyingParty.CreateRequest(TextBoxOpenID.Text, "https://www.yoursite.com/").RedirectToProvider();
这将确保您的用户每次都获得相同的ClaimedIdentifier.
标签:c,net,dotnetopenauth 来源: https://codeday.me/bug/20190606/1190519.html