Asp.net mvc 在.NET中使用FB Connect/Google OAuth登录

Asp.net mvc 在.NET中使用FB Connect/Google OAuth登录,asp.net-mvc,openid,oauth-2.0,Asp.net Mvc,Openid,Oauth 2.0,我想允许我的用户使用我的登录系统或FB Connect或Google登录登录我的网站。我不想只为这两个选项使用大型库(比如dotnetOpenAuth)——那么我应该如何实现这一点呢 附加问题-我应该如何将FB/Google用户绑定到我的内部用户系统?我想允许使用这两种方式登录(例如,我可以使用FB登录,然后使用Google登录,并且仍然绑定到同一个用户) 我正在使用ASP.NETMVC2 谢谢 如果您不喜欢使用像这样的大型库,则必须手动实现OpenID协议。你将需要遵守 尽管如此,我还是建议您

我想允许我的用户使用我的登录系统或FB Connect或Google登录登录我的网站。我不想只为这两个选项使用大型库(比如dotnetOpenAuth)——那么我应该如何实现这一点呢

附加问题-我应该如何将FB/Google用户绑定到我的内部用户系统?我想允许使用这两种方式登录(例如,我可以使用FB登录,然后使用Google登录,并且仍然绑定到同一个用户)

我正在使用ASP.NETMVC2


谢谢

如果您不喜欢使用像这样的大型库,则必须手动实现OpenID协议。你将需要遵守

尽管如此,我还是建议您使用现有的库
DotnetOpenAuth
是.NET的参考库

还有一个小提示:OpenId和OAuth是不同的标准,旨在实现不同的功能:
OpenId
用于身份验证,而
OAuth
用于授权

至于识别可以从不同OpenID提供者登录的同一用户,您需要一些东西来识别他们。例如,使用DotnetOpenAuth,在创建对OpenID提供程序的身份验证请求时,您可能需要全名和电子邮件:

using (var openid = new OpenIdRelyingParty())
{
    var request = openid.CreateRequest(Identifier.Parse(openid_identifier));

    request.AddExtension(new ClaimsRequest
    {
        BirthDate = DemandLevel.NoRequest,
        Email = DemandLevel.Require,
        FullName = DemandLevel.Require
    });
}
并使用此信息识别内部数据库中的用户

这就是我的想法:

  • 创建一个内部数据库表,其中将包含站点用户。开始时,这张桌子是空的
  • 用户来到您的站点并希望使用它。他还没有通过身份验证,所以你要他出示证件。您可以让他选择OpenId提供程序,准备身份验证请求,并将他重定向到提供程序进行身份验证
  • 用户通过其提供商进行身份验证,并被重定向回您的站点。此时,您知道他声明的身份,并将该用户添加到users表中。现在用户可以随时返回您的站点并登录
  • 您可以向经过身份验证的用户提供添加另一个OpenId提供程序的可能性(就像StackOverflow一样)。重要的想法是,用户需要已经通过您的站点的身份验证才能做到这一点。因此,他可以输入他的替代OpenId提供程序,并重定向到此提供程序进行身份验证。一旦他进行了身份验证,他就会被重定向回您的站点,因为他已经通过了您站点的身份验证,您可以将他的替代OpenId提供者添加到用户表中
  • 将处理OpenId提供程序重定向的控制器操作应检查用户是否已通过您站点的身份验证,如果未通过身份验证,则使用
    FormsAuthentication.GetAuthCookie
    并传递声明的身份对其进行身份验证。如果您的内部用户表中不存在声明的标识,则需要添加该标识。如果用户已经通过您站点的身份验证,则意味着他正在向其配置文件中添加替代OpenId提供程序,因此您将更新用户表并向其中添加新的提供程序

  • 也许你知道谷歌登录系统的一些小实现?谢谢。我只是担心它太复杂,而且100%可靠。是吗?:)@罗曼,它是可靠的,但确实不太容易设置
    DotnetOpenAuth
    附带了许多示例,而
    OpenIdRelyingPartyMvc
    示例将向您展示将OpenId集成到现有ASP.NET MVC站点的基本步骤。认证过程分为两步:首先,您显示一个登录表单,提交该表单时,将创建一个OpenId认证请求给相应的提供者。然后,用户将被重定向,一旦他通过身份验证,他将被重定向回您的站点,您可以在那里检索他声明的身份,然后只需使用
    FormsAuthentication.GetAuthCookie
    。非常感谢您提供的详细答案。这帮了大忙!