【问题标题】:Implementing OpenID in ASP.net "Properly" - Membership or Authentication Provider?在 ASP.net 中“正确”实现 OpenID - 成员资格或身份验证提供程序?
【发布时间】:2012-03-09 17:30:29
【问题描述】:

在 ASP.net 站点上使用 OpenID 有多种方法,但似乎没有一种方法使用现有的成员资格和身份验证提供程序机制。

我想知道创建一个完全依赖 OpenID 的网站的正确方法是什么?继续使用表单身份验证,但实现对 OpenID 进行查找的 SqlMembershipProvider 的变体?

或者我会更深入一层并编写自己的 FormsAuthenticationModule?这似乎有点太简单了,因为(据我所知)Forms Authentication 可以针对任何数据源进行查找。

或者是否有第三种方法,保留 FormsAuthenticationModule 但使其针对 OpenID 进行查找?

因为这是一个 ASP.net MVC 应用程序,所以我没有使用内置的登录 WebForms 控件,如果这有什么不同的话。

【问题讨论】:

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


    【解决方案1】:

    ASP.NET 定义的 Membership API 与 OpenID 完全不匹配,这可能是您没有看到很多系统使用它的原因。我还没有看到需要将 Membership 提供程序与 OpenID 一起使用,所以它还没有真正成为问题。 http://code.google.com/p/dotnet-membership-provider/ 是一个试图使 Membership 提供者模型适合 OpenID 的项目,但它看起来最近没有得到维护。

    正如 womp 所说,您不需要重做 FormsAuthenticationModule。它与 OpenID 完美配合。

    查看DotNetOpenAuth 附带的project templates,了解在没有会员提供程序的情况下如何运作。

    【讨论】:

    【解决方案2】:

    OpenID Membership Provider 项目可能是您正在寻找的。

    即使您没有使用登录控件,仍建议利用 Membership Provider 模型进行身份验证。

    通常没有必要像实现 FormsAuthentication 特定功能那样深入,因为编写 MembershipProvider 非常简单,而且我从未发现它不够灵活以处理的情况。请注意,通常您只需要实现接口的一种方法 (ValidateUser()) 即可获得工作提供程序。

    【讨论】:

    • 请注意,该项目使用的是 非常 旧版本的 OpenID 库,不建议在未升级到最新版本的情况下使用(DotNetOpenAuth 可在 dotnetopenid.googlecode.com 获得)
    【解决方案3】:

    这是一个老问题,但我还没有看到我在搜索它时使用的方法,所以这里是。 (它只在 Google 上进行了测试,因为我正在创建与我公司的 Google Apps for Business 帐户集成的外观,而不是完整的 OpenID 集成。)

    我使用DotNetOpenAuth 声明 OpenID,确保需要电子邮件地址。

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

    然后,当我收到经过验证的回复时,我会从电子邮件中查找用户名:

                case AuthenticationStatus.Authenticated:
                    ClaimsResponse info = response.GetExtension<ClaimsResponse>();
                    string username = Membership.GetUserNameByEmail(info.Email);
                    FormsAuthentication.SetAuthCookie(username, true);
                    return Redirect(ReturnUrl ?? "/");
    

    假设您还设置了成员资格和角色提供程序,为适当的用户名设置表单身份验证 cookie 可以让您访问所有其他成员资格和角色。

    【讨论】:

    • 如何保存到会员数据库?
    • 保存,如创建新帐户?
    • 是的,你如何处理密码?
    • 我并没有真正考虑过。在我的实现中,openID 只是他们可以使用的东西,而不是使用用户名和密码登录,因此他们照常创建帐户。但由于从未使用过密码,您可能只需调用适当的 memembership 方法来创建具有永远不会使用的虚拟密码的用户,设置用户名和电子邮件地址以匹配他们的 OpenID 电子邮件地址。跨度>
    【解决方案4】:

    DotNetOpenId 中包含的 ASP.NET MVC 示例使用 FormsAuthentication 在用户通过 OpenID 身份验证后登录。据我所知,它没有与会员系统进行任何集成。

    【讨论】:

      【解决方案5】:

      如果有人遇到一个好的 c# janrain 示例 - 请告诉我。

      我有 dsn 指向 tumblr,然后对于登录小部件,它会返回到一个子域,在该子域中我有它指向根目录下的文件夹的路径。

      然后我在那里有一个 app_code 文件夹,我正在使用这个 c# 助手类 - 我可以很好地取回令牌,它会将我带到我的 members.domain.com,所以小部件正在工作 - 只需要得到他们用于访问会员区的提供商的用户详细信息。

      http://groups.google.com/group/rpx-developers/web/c-helper-class?_done=/group/rpx-developers%3F

      是辅助类

      错误

      “/”应用程序中的服务器错误。 意外的 API 错误 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

      异常详细信息:System.Exception:意外的 API 错误

      来源错误:

      第 22 行: 第 23 行:Rpx feedit = new Rpx("apikey", "https://learnbartending.rpxnow.com/"); 第 24 行:feedit.AuthInfo(justoken); 第 25 行:XmlElement xmlstuff = feedit.AuthInfo(justoken); 第 26 行:

      源文件:c:\Inetpub\vhosts\learnbartending.com\httpdocs\members\Default.aspx.cs 行:24

      堆栈跟踪:

      【讨论】:

        【解决方案6】:

        如果您需要利用会员数据库中的userID(guid),那么您将不得不在他们首次登录时创建一个骨架帐户,然后找出一些在后续登录时轮换新密码的机制。这个密码显然是给您的会员提供者的,并且是透明的。

        现在有趣的部分是找到常见的元数据?可能是 HMM 的电子邮件地址?

        我也在使用 facebook connect 解决这个难题。我必须有一个用户 ID 才能将它们与我数据库中的分类帖子联系起来。

        有趣的东西。

        只是一个更新。我得到了很好的工作。

        我创建了一个表

        CREATE TABLE [dbo].[OAuthUsers]
        (
            [OuthUserID] [int] IDENTITY(1,1) NOT NULL,
            [UserID] [uniqueidentifier] NOT NULL,
            [access_token] [varchar](150) NULL,
            [expires_in] [datetime2](7) NULL,
            [refresh_token] [varchar](150) NULL,
            [issued_at] [datetime2](7) NULL,
            [user_id] [varchar](50) NOT NULL,
            [domain] [varchar](50) NULL,
            [scope] [varchar](150) NULL,
            CONSTRAINT [PK_OAuthUsers] PRIMARY KEY CLUSTERED
        )
        

        为 facebook 或 openid 存储 access_token。 OpenID 有一个你可以请求的刷新令牌,所以也要存储它

        我有一个 ashx 处理程序作为我的 redirect_url。在该处理程序中,您可以为每种情况进行所有处理,用户已经在提供者数据库中拥有一个帐户,用户在提供者数据库中没有帐户,因此我们创建一个。所有这些整洁的废话:)

        玩得开心。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 2011-07-25
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 2014-11-16
          • 2012-07-17
          相关资源
          最近更新 更多