2011-03-05 91 views
0
我使用DotOpenID

獲取用戶的細節,我想獲取用戶的暱稱和電子郵件ID希望通過DotNetOpenID

的要求

protected void loginButton_Click(object sender, EventArgs e) 
{ 

    if (!openidValidator.IsValid) return; // don't login if custom validation failed. 
    OpenID(openid_identifier.Text); 
} 

private void OpenID(string Indentifier) 
{ 
    OpenIdRelyingParty openid = new OpenIdRelyingParty(); 
    try 
    { 
     IAuthenticationRequest request = openid.CreateRequest(Indentifier); 
     // Send your visitor to their Provider for authentication. 
     ClaimsRequest fetch = new ClaimsRequest(); 
     fetch.FullName = DemandLevel.Require; 
     fetch.Email = DemandLevel.Require; 
     request.AddExtension(fetch); 
     request.RedirectToProvider(); 
    } 
    catch (Exception ex) 
    { 
     // The user probably entered an Identifier that 
     // was not a valid OpenID endpoint. 
     openidValidator.Text = ex.Message; 
     openidValidator.IsValid = false; 
    } 
} 

和響應

openid_identifier.Focus(); 
    OpenIdRelyingParty openid = new OpenIdRelyingParty(); 
    if (openid.Response != null) 
    { 
     switch (openid.Response.Status) 
     { 
      case AuthenticationStatus.Authenticated: 

       string email = ""; 
       string alias = ""; 

       ClaimsResponse fetch = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse; 
       alias = fetch.Nickname; 
       email = fetch.Email; 

       if (string.IsNullOrEmpty(alias)) 
        alias = openid.Response.ClaimedIdentifier; 
       if (string.IsNullOrEmpty(email)) 
        email = openid.Response.ClaimedIdentifier; 


       FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, chkRememberMe.Checked); 
       break; 
      case AuthenticationStatus.Canceled: 
       loginCanceledLabel.Visible = true; 
       break; 
      case AuthenticationStatus.Failed: 
       loginFailedLabel.Visible = true; 
       break; 

     } 
    } 

但我在這裏得到異常「未將對象引用設置爲對象的實例」。

ClaimsResponse fetch = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse; 
       alias = fetch.Nickname; 
       email = fetch.Email; 

回答

2

可能重複:
claimsResponse Return Null
https://stackoverflow.com/questions/3265678/dotnetopenid-claimsresponse-always-null

第一個具有由安德魯·阿諾特以下的答案,這可能與:

它看起來像你做的一切 沒錯。在這一點上,它取決於您使用的 提供程序。你測試哪一個是 ?有些不支持簡單註冊 (ClaimsRequest)。其他人只有 支持列入白名單的RP。然後 其他人不支持它時,您的RP 是在「本地主機」。

我的建議是:對myopenid.com測試, 作爲似乎有好,一致 行爲,並支持簡單 延期註冊。但是您的RP 必須隨時準備接收 null的ClaimResponse,因爲您是 從未保證OP會給你 什麼。

即使你得到一個非空的結果,你問 (即使你標記它們所需) 各個字段可以 爲空或空白。