2011-08-10 80 views
0

自己在使用C#中验证交换我的应用程序implementented SSO通过Dotnetopenauth谷歌openID问题标记?

我的疑虑如下,

  1. 在我的AX请求的响应,我不接受任何令牌。我需要发送任何参数吗?
  2. 在我的应用程序中,我需要用户每次都登录提供程序,但是如果用户在“下次自动登录”时单击复选框,它就再也不会从用户那里询问用户名和密码。
  3. AX fetchResponse null用于MyopenId。它是否仅支持简单注册?

请求代码:

IAuthenticationRequest request = openid.CreateRequest(txt_openid_identifier.Text); 

    var fetchRequest = new FetchRequest(); 
    fetchRequest.Attributes.Clear(); 
    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.First); 
    fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Last);      fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.HomeAddress.Country);     
      request.AddExtension(fetchRequest); 

      // Issue request to OP 
      request.RedirectToProvider(); 

响应代码:

using (var openid = new OpenIdRelyingParty()) 
     { 
      var response = openid.GetResponse(); 

      if (response == null) return; 

      switch (response.Status) 
      { 

       case AuthenticationStatus.Authenticated: 
        string emailID = string.Empty; 
        Session["email"] = string.Empty; 
        Session["name"] = string.Empty; 
        Session["country"] = string.Empty; 
        Session["Accesskey"] = string.Empty; 
        Session["SecretAccesskey"] = string.Empty; 

        var fetchResponse = response.GetExtension<FetchResponse>(); 

        if (fetchResponse.Attributes.Contains(WellKnownAttributes.Contact.Email)) 
        { 
         IList<string> emailAddresses = 
          fetchResponse.Attributes[WellKnownAttributes.Contact.Email].Values; 
         emailID = emailAddresses.Count > 0 ? emailAddresses[0] : null; 
        } 
        else 
         emailID = string.Empty; 
      } 
     } 

回答

0

我发现,某些供应商(即myopenid.com)返回null为FetchRequest,同时返回有效数据ClaimsRequest。看起来不同的提供者支持不同的属性交换机制。在请求:

var request = openid.CreateRequest(Request.Form["openid_identifier"]); 

var sr = new ClaimsRequest 
{ 
    Email = DemandLevel.Request, 
    FullName = DemandLevel.Request 
}; 
request.AddExtension(sr); 

var fetchRequest = new FetchRequest(); 
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
fetchRequest.Attributes.AddOptional(WellKnownAttributes.Name.FullName); 
request.AddExtension(fetchRequest); 

return request.RedirectingResponse.AsActionResult(); 

,并拿起响应时:

string email, fullName = String.Empty; 
var fetch = response.GetExtension<FetchResponse>(); 
if (fetch != null) 
{ 
    email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email); 
    fullName = fetch.GetAttributeValue(WellKnownAttributes.Name.FullName); 
} 
var claimResponse = response.GetExtension<ClaimsResponse>(); 
if (claimResponse != null) 
{ 
    email = claimResponse.Email; 
    fullName = claimResponse.FullName; 
} 

因此,我们尝试这两种方式,并希望从的至少一种方法获取数据。