代码之家  ›  专栏  ›  技术社区  ›  Andre Pena

DotNetOpenAuth:为什么我在收到一封电子邮件时不能得到相同的OpenID?

  •  4
  • Andre Pena  · 技术社区  · 15 年前

    我想做的很简单:

    从用户处获取OpenID,存储它,并将其与用户帐户相关联。每次从提供程序返回唯一的OpenID时,我都知道关联的用户现在已经登录。很简单。

    问题是 response.ClaimedIdentifier.OriginalString 这就是我认为OpenID不是唯一的。它几乎是独一无二的。大多数时候返回的值是相同的,但有时,并非总是,由于某些原因(特别是更改浏览器或计算机),此值会更改,我会为用户创建另一个帐户。

    我做错什么了?我必须存储的真正的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();
                    }
                }
    
    1 回复  |  直到 15 年前
        1
  •  6
  •   Andrew Arnott    15 年前

    你很接近,但你的代码有点偏离。唯一标识符无效 response.ClaimedIdentifier.OriginalString ,但很简单 response.ClaimedIdentifier internal 以避免混淆。尽管 ClaimedIdentifier 属于类型 Identifier

    现在是关于拆分用户帐户的问题。最可能的问题是,OpenID称之为“定向标识”,即OpenID提供者(在本例中为Google)发送 不同的 IAuthenticationRequest.Realm 财产。这是非常重要的,你的网站确保 Realm 总是有相同的价值,使谷歌承认你的网站是同一个每次,从而发布给你相同的 每次对同一个用户。

    王国 值显式,DotNetOpenAuth猜测它是您的主页的URL。但这是基于请求的URL。例如,如果用户可以使用 http://www.yoursite.com/ https://www.yoursite.com/ http://yoursite.com http://www.yoursite.com (注意www)那也就变成了两个不同的领域值。然后您需要显式地设置领域,如下所示:

    relyingParty.CreateRequest(TextBoxOpenID.Text, "https://www.yoursite.com/").RedirectToProvider();
    

    这将确保您的用户每次都获得相同的ClaimedIdentifier。