C# 在ASP.NETMVC3中使用OpenID,从何处获取用户数据?

C# 在ASP.NETMVC3中使用OpenID,从何处获取用户数据?,c#,asp.net-mvc-3,openid,dotnetopenauth,steam,C#,Asp.net Mvc 3,Openid,Dotnetopenauth,Steam,我意识到OpenID是一个庞然大物,或者比一个典型的注册表更复杂,但我觉得我在这里遗漏了一些东西 根据这一点,我应该保存提供者提供的唯一标识符密钥 提供商将为每个用户提供一个唯一的ID-这是您需要的 保存。这是您将如何匹配刚登录的用户 数据库中的记录 在中,此唯一ID在LogOn()操作方法中的开关内给出: public ActionResult LogOn() { var openid = new OpenIdRelyingParty(); IAuthenticationRes

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

根据这一点,我应该保存提供者提供的唯一标识符密钥

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

在中,此唯一ID在
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();
    }
}
public ActionResult登录()
{
var openid=new OpenIdRelyingParty();
IAAuthenticationResponse=openid.GetResponse();
if(响应!=null)
{
开关(响应状态)
{
案例验证状态。已验证:
FormsAuthentication.RedirectFromLoginPage(

response.claimdidentifier,false);//成功登录后,您可以对接收到的数据执行任何操作: 唯一标识符包含您请求的声明

  • 将收集的数据存储在数据库记录中
  • 将其保存在cookie中(将其作为令牌发送到您的服务(如果有),或者在RP(依赖方)中使用它)
  • 与通用成员资格提供程序或简单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)并将它们链接到用户。这将允许您的唯一用户也可以使用任何身份验证提供商登录

    有关使用OpenId验证器的完整示例,您可以查看OpenId For MVC2项目
    我从中提取了上一个示例。

    这是一个如何将OpenID实现到MVC3应用程序中的非常好的示例。我不熟悉Steam,但其中大部分工作都是类似的。这可能是一个很好的起点。其思想是,您可以在逻辑上“连接”您的本地用户信息与外部帐户(比如Facebook)共享。当您想从该Facebook帐户获取信息时,需要保存Facebook用户id,这样您就不需要在本地检索和保存这些信息。我认为这些链接可能对您的问题有帮助