2009-09-08 3 views
6

DotNetOpenAuth을 사용하여 웹 응용 프로그램에서 openID를 통합했습니다. 아래 코드는 제공자에게 정보를 요청합니다.openID 사용자 정보가 프로토콜을 통과하지 않는 이유는 무엇입니까?

try 
{ 
    var req = openid.CreateRequest(Request.Form["openid_identifier"]); 
    req.AddExtension(new DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.ClaimsRequest 
    { 
    Email = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Require, 
    FullName = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Require, 
    Nickname = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Request, 
    PostalCode = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Request 
    }); 

    return req.RedirectingResponse.AsActionResult(); 
} 

어떤 이유로 오픈 아이디 공급자의 응답은 내가 요청한 정보와 함께 제공되지 않습니다. 백만 가지 방법으로 response.ClaimedIdentifier 그것은 결코 내가 뭔가를 할 수있는 가치있는 정보가 없습니다 :

// Stage 3: OpenID Provider sending assertion response 
switch (response.Status) { 
    case AuthenticationStatus.Authenticated: 
    Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay; 
    FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false); 
    if (!string.IsNullOrEmpty(returnUrl)) { 
     return Redirect(returnUrl); 
    } else { 
     return RedirectToAction("Index", "Home"); 
    } 

내가 시도 : 아래는 코드입니다. 어떤 아이디어?

답변

6

IAuthenticationResponse.ClaimedIdentifier 속성 never에는 요청한 이러한 특성이 포함되어 있습니다. 그것은 단지 OpenID 사용자의 "username"만을 포함합니다.

요청을 완벽하게 보냅니다. 긍정적 인 응답을 처리하는 데 조금만 추가하십시오.

// Stage 3: OpenID Provider sending assertion response 
switch (response.Status) { 
    case AuthenticationStatus.Authenticated: 
    Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay; 
    FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false); 
    var sreg = response.GetExtension<ClaimsResponse>(); 
    if (sreg != null) { // the Provider MAY not provide anything 
     // and even if it does, any of these attributes MAY be missing 
     var email = sreg.Email; 
     var fullName = sreg.FullName; 
     // get the rest of the attributes, and store them off somewhere. 
    } 
    if (!string.IsNullOrEmpty(returnUrl)) { 
     return Redirect(returnUrl); 
    } else { 
     return RedirectToAction("Index", "Home"); 
    } 
    break; 
    // ... 
+0

안녕하세요, Andrew : 대단히 감사합니다. 구글은 이메일을 돌려 준다. 야후는 그렇지 않다. 도와 주셔서 감사합니다. – Geo

+0

Yahoo가 지금 있어야합니다 ... 그들은 단지 그것을 지원하기 위해 업그레이드했습니다. –

관련 문제