2010-06-22 46 views
4

我试图使用OpenID /依赖方(Google,Yahoo!..)登录。我的登录页面如下。DotNetOpenAuth:为什么我的电子邮件没有得到相同的OpenID?

我想要做的是简单的:

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

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

我在做什么错?无论浏览器或计算机如何,我必须存储的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(); 
       } 
      } 

回答

6

你很接近,但是在你的代码中略有偏差。唯一标识符不是response.ClaimedIdentifier.OriginalString,而只是response.ClaimedIdentifier。 OriginalString稍有不同,实际上它可能应该标记为internal以避免混淆。尽管ClaimedIdentifier的类型为Identifier,但在将其分配给字符串变量时,它实际上会自动成为一个字符串,因此不必担心。

现在关于拆分用户帐户。最有可能的问题是OpenID称为“定向身份”,这是OpenID Provider(Google在这种情况下)向同一用户发送不同的 OpenID,具体取决于IAuthenticationRequest.Realm属性的值。您的网站确保Realm始终具有相同的值,这样Google每次都会将您的网站识别为同一个网站,因此每次向同一用户发送相同的ClaimedIdentifier是非常重要的。

那么可能会出现什么问题?如果你没有明确地设置Realm值,DotNetOpenAuth会猜测它是你主页的URL。但是,这是基于请求的URL。例如,如果用户可以使用这两个http://www.yoursite.com/https://www.yoursite.com/(注意第二个https方案)访问您的站点,则两者都是合法主页,而DotNetOpenAuth将使用无论用户恰好在访问您的登录页面。同样,如果您的网站在http://yoursite.comhttp://www.yoursite.com(注意www)都可用,那么这也会变成两个不同的领域值。你需要做的则是设定明确的境界,喜欢的东西:

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

这将确保用户每次得到相同的ClaimedIdentifier。

+0

谢谢!愿上帝拯救你的灵魂 – 2010-06-29 14:56:14

相关问题