如何将OpenId与ASP.Net成员集成在MVC中

时间:2009-07-27 05:42:40

标签: asp.net-mvc asp.net-membership openid

我使用MVC Storefront中的以下代码在MVC中测试OpenId。 如何将其与我的ASP.Net会员资格集成,以便我可以使用角色并在我的表格中为用户保存用户名?我相信SO也使用类似的东西。

    public ActionResult OpenIdLogin()
    {
        string returnUrl = VirtualPathUtility.ToAbsolute("~/");
        var openid = new OpenIdRelyingParty();
        var response = openid.GetResponse();
        if (response == null)
        {
            // Stage 2: user submitting Identifier
            Identifier id;
            if (Identifier.TryParse(Request["openid_identifier"], out id))
            {
                try
                {
                    IAuthenticationRequest req = openid.CreateRequest(Request["openid_identifier"]);

                    var fetch = new FetchRequest();
                    //ask for more info - the email address
                    var item = new AttributeRequest(WellKnownAttributes.Contact.Email);
                    item.IsRequired = true;
                    fetch.Attributes.Add(item);
                    req.AddExtension(fetch);

                    return req.RedirectingResponse.AsActionResult();
                }
                catch (ProtocolException ex)
                {
                    ViewData["Message"] = ex.Message;
                    return View("Logon");
                }
            }
            else
            {
                ViewData["Message"] = "Invalid identifier";
                return View("Logon");
            }
        }
        else
        {
            // Stage 3: OpenID Provider sending assertion response
            switch (response.Status)
            {
                case AuthenticationStatus.Authenticated:

                    var fetch = response.GetExtension<FetchResponse>();
                    string name = response.FriendlyIdentifierForDisplay;
                    if (fetch != null)
                    {
                        IList<string> emailAddresses = fetch.Attributes[WellKnownAttributes.Contact.Email].Values;
                        string email = emailAddresses.Count > 0 ? emailAddresses[0] : null;
                        //don't show the email - it's creepy. Just use the name of the email
                        name = email.Substring(0, email.IndexOf('@'));
                    }
                    else
                    {

                        name = name.Substring(0, name.IndexOf('.'));
                    }

                    //FormsAuthentication.SetAuthCookie(name, false);
                    SetCookies(name, name);
                    AuthAndRedirect(name, name);

                    if (!string.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                case AuthenticationStatus.Canceled:
                    ViewData["Message"] = "Canceled at provider";
                    return View("Logon");
                case AuthenticationStatus.Failed:
                    ViewData["Message"] = response.Exception.Message;
                    return View("Logon");
            }
        }
        return new EmptyResult();

    }

    ActionResult AuthAndRedirect(string userName, string friendlyName)
    {
        string returnUrl = Request["ReturnUrl"];
        SetCookies(userName, friendlyName);

        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

2 个答案:

答案 0 :(得分:6)

StackOverflow上有几个像你这样的问题。 This one似乎特别相似。

如果您已经在为您的网站使用会员资格提供程序,并且只是向其添加OpenID,那么我想您现在仍然坚持使用会员资格并且可以使用我链接到的问题的答案之一来获取可以为您工作的半正式会员提供商。

但是,如果您正在编写一个新站点,并且只是想要“使用角色并在我的表中为用户保存用户名”,那么请不要使用ASP.NET成员资格。这不值得!它不适合OpenID的无密码范例,只会导致比其他任何事情更悲伤。如果你不害怕自己的一点点数据库访问,那就这样做吧。您只需发出自己的FormsAuthentication.RedirectFromLoginPageFormsAuthentication.SetAuthCookie来电并传入用户填写的角色,即可轻松获得角色行为。

答案 1 :(得分:1)

open id提供程序将返回有关用户的数据。如果您不请求/要求特定的信息令牌,那么您将获得的只是用户的显示名称和身份URL。

根据您正在使用的开放ID库,您可以请求FirstName LastName,DOB(如果您真的关心)等令牌,如果用户提供了有关其所选身份的信息,那么您会将其返回给您

然后,您可以使用此功能在成员资格系统中创建新用户。你可能不得不给他们一个虚拟密码来解决Membership API的要求。

要验证登录信息,请提供1个用户名和表格的表单。密码和另一个带有身份URL的密码。通过open id验证用户后,尝试通过Membership API中的用户名(identity url)查找用户。如果它不存在,请创建它。