10

我意识到 OpenID 有点像庞然大物,或者比典型的注册表单更复杂,但我觉得我在这里遗漏了一些东西。

根据这个问题,我应该保存我的提供者给我的唯一标识符密钥。

提供商将为您提供每个用户的唯一 ID - 您需要保存此 ID。这是您将刚刚登录的用户与数据库中的记录相匹配的方式。

我的代码(取自 MVC 部分)LogOn()中,此唯一 ID 在操作方法中的开关内给出:

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

4

1 回答 1

1

当您成功登录后,您可以对收到的数据做任何您想做的事情:唯一标识符以及您请求的声明。

  1. 将收集的数据存储在数据库记录中。
  2. 将其保存在 cookie 中(将其作为令牌发送到您的服务(如果有)或在您的 RP(依赖方)中使用)。
  3. 将它与通用成员提供程序或简单的 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's 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 身份验证器的完整示例,您可以查看 MVC2 项目1的 OpenId, 我从中提取了前面的示例。

于 2013-10-03T14:52:15.660 回答