2011-08-10 3 views
0

Myself implementented SSO в моем приложении с использованием аутентификации Обмен в C# по Dotnetopenauth. Google 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(); 

Response Code:

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) возвращаются нулем для 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; 
} 

Таким образом, мы пытаемся в обоих направлениях, и мы надеемся, получает данные, по меньшей мере, один из методов.

Смежные вопросы