2010-06-22 4 views
4

OpenID/Relying Party (Google, Yahoo! ..)를 사용하여 로그인을 시도하고 있습니다. 내 로그인 페이지는 다음과 같습니다.DotNetOpenAuth : 전자 메일을받은 동일한 OpenID를 얻지 못하는 이유는 무엇입니까?

는 내가하고 싶은 간단하다

는 사용자로부터 오픈 ID를 취득하여 보관하고, 사용자 계정과 연결. 고유 한 OpenID가 공급자로부터 반환 될 때마다 연결된 사용자가 이제 로그인 된 것입니다. Simple.

문제는 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으로 표시되어야합니다. ClaimedIdentifierIdentifier 유형이지만 문자열 변수에 할당하면 실제로 자동으로 문자열이되므로 걱정하지 마십시오.

이제 사용자 계정이 분할됩니다. 대부분의 경우 문제는 OpenID가 IAuthenticationRequest.Realm 속성의 값에 따라 동일한 사용자의 OpenID 공급자 (이 경우 Google)가 다른 사용자에게 OpenID를 보내는 "지정 ID"를 호출하는 것입니다. Realm은 항상 동일한 값을 유지하므로 사이트가 매번 동일한 사이트로 인식되므로 매번 동일한 사용자에 대해 동일한 ClaimedIdentifier을 발급 받으시기 바랍니다.

그래서 무엇이 잘못 될 수 있습니까? Realm 값을 명시 적으로 설정하지 않으면 DotNetOpenAuth가 홈 페이지의 URL이라고 추측합니다. 예를 들어, 사용자가 을 사용하여 사이트를 방문 할 수있는 경우http://www.yoursite.com/https://www.yoursite.com/ (두 번째 사이트의 https 체계 참고) 둘 다 합법적 인 홈 페이지이며 DotNetOpenAuth는 다음을 사용합니다. 사용자가 귀하의 로그인 페이지를 방문했을 때 어떤 방식 으로든. 마찬가지로 귀하의 사이트가 http://yoursite.comhttp://www.yoursite.com (www를 적어주십시오)에서 사용 가능하다면 두 사이트가 너무 다른 두 영역 값이됩니다. 사용자가 같은 ClaimedIdentifier 각 시간을 얻을 수 있도록한다

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

이 : 당신은 같은과, 명시 적으로 영역을 설정 한 후해야 할 일은.

+0

감사합니다. 신이 너의 영혼을 구할 수있어. –

관련 문제