2011-03-05 65 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会给你 什么。

即使你得到一个非空的结果,你问 (即使你标记它们所需) 各个字段可以 为空或空白。