Использование OpenID в ASP.Net MVC3, где я могу получить данные пользователя?

Я понимаю, что OpenID - скорее бегемот, или более сложный, чем типичная форма регистрации, но я чувствую, что здесь что-то не хватает.

В соответствии с этим question я должен сохранить уникальный идентификационный ключ, предоставленный моим провайдером.

Поставщик предоставит вам уникальный идентификатор для каждого пользователя - вам это нужно сохранить. Это то, как вы будете соответствовать пользователю, который только что вошел в систему с запись в вашей базе данных.

В мой код (взятый из части MVC), этот уникальный идентификатор указан внутри коммутатора в методе действия LogOn():

public ActionResult LogOn()
{
    var openid = new OpenIdRelyingParty();
    IAuthenticationResponse response = openid.GetResponse();

    if (response != null)
    {
        switch (response.Status)
        {
            case AuthenticationStatus.Authenticated:
                FormsAuthentication.RedirectFromLoginPage(
                    response.ClaimedIdentifier, false);  // <-------- ID HERE! "response.ClaimedIdentifier"
                break;
            case AuthenticationStatus.Canceled:
                ModelState.AddModelError("loginIdentifier",
                    "Login was cancelled at the provider");
                break;
            case AuthenticationStatus.Failed:
                ModelState.AddModelError("loginIdentifier",
                    "Login failed using the provided OpenID identifier");
                break;
        }
    }

    return View();
}

[HttpPost]
public ActionResult LogOn(string loginIdentifier)
{
    if (!Identifier.IsValid(loginIdentifier))
    {
        ModelState.AddModelError("loginIdentifier",
                    "The specified login identifier is invalid");
        return View();
    }
    else
    {
        var openid = new OpenIdRelyingParty();
        IAuthenticationRequest request = openid.CreateRequest(Identifier.Parse(loginIdentifier));

        // Require some additional data
        request.AddExtension(new ClaimsRequest
        {
            BirthDate = DemandLevel.NoRequest,
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require
        });

        return request.RedirectingResponse.AsActionResult();
    }
}

Я использую этот идентификатор для FormsAuthentication.SetAuthCookie(IDHERE, true);?

Что делать, если я хочу также сохранить информацию о пользователях, такую ​​как электронная почта, имя, псевдоним или что-то еще. Как получить этот сбор данных от полагающейся стороны? Если этот процесс зависит от поставщика, которого я использую, я использую провайдер Steam OpenID:

http://steamcommunity.com/openid http://steamcommunity.com/dev

Ответ 1

Когда вы успешно вошли в систему, вы можете делать все, что хотите, с полученными данными: уникальный идентификатор с запросами, которые вы запросили.

  • Храните собранные данные в записи базы данных.
  • Сохраните его в файле cookie (либо отправьте его как токен в свои службы, если он есть, либо используйте его в вашей RP (Reliant party)).
  • Используйте его вместе с универсальным поставщиком членства или простым провайдером Sql.

Вот как вы должны иметь второе действие в вашем контроллере:

    [AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
    public ActionResult LogOnPostAssertion(string openid_openidAuthData)
    {
        IAuthenticationResponse response;
        if (!string.IsNullOrEmpty(openid_openidAuthData))
        {
            var auth = new Uri(openid_openidAuthData);
            var headers = new WebHeaderCollection();
            foreach (string header in Request.Headers)
            {
                headers[header] = Request.Headers[header];
            }

            // Always say it a GET since the payload is all in the URL, even the large ones.
            HttpRequestInfo clientResponseInfo = new HttpRequestInfo("GET", auth, auth.PathAndQuery, headers, null);
            response = this.RelyingParty.GetResponse(clientResponseInfo);
        }
        else
        {
            response = this.RelyingParty.GetResponse();
        }
        if (response != null)
        {
            switch (response.Status)
            {
                case AuthenticationStatus.Authenticated:
                    var token = RelyingPartyLogic.User.ProcessUserLogin(response);
                    this.FormsAuth.SignIn(token.ClaimedIdentifier, false);
                    string returnUrl = Request.Form["returnUrl"];
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                case AuthenticationStatus.Canceled:
                    ModelState.AddModelError("OpenID", "It looks like you canceled login at your OpenID Provider.");
                    break;
                case AuthenticationStatus.Failed:
                    ModelState.AddModelError("OpenID", response.Exception.Message);
                    break;
            }
        }

Другие подсказки о том, что вы можете сделать с полученными данными: Создав запись входа пользователя в таблицу UserLogin в своей базе данных сторонних пользователей (ваше приложение). Вы сможете проверить подлинность и статус своего пользователя в следующий раз, когда он посетит ваше приложение. Вы также можете перенаправить его в первый раз на конкретную страницу для сбора более конкретных данных, которые поставщик OPENID не предоставил (например, возраст или пол). Вы можете отслеживать все пользовательские логины (OpenID (steam), google, liveID) и связывать их с пользователем. Это позволит вашему уникальному пользователю войти в систему с помощью любого провайдера проверки подлинности, который он также хотел бы.

В качестве полного примера, использующего аутентификатор Open ID, вы можете посмотреть проект OpenId для MVC2 1 из которого я извлек предыдущий пример.