Google OpenID выдает токен? - PullRequest
       19

Google OpenID выдает токен?

0 голосов
/ 10 августа 2011

Я сам реализовал единый вход в моем приложении с использованием Authentication Exchange в c # от Dotnetopenauth

Мои сомнения следующие:

  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;
            }
        }

1 Ответ

0 голосов
/ 21 октября 2011

Я обнаружил, что некоторые провайдеры (например, 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;
}

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

...