编程语言
首页 > 编程语言> > c# – DotNetOpenAuth:为什么我不会在给出电子邮件的情况下获得相同的OpenID?

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