在ASP.net中“正确”实现OpenID - 成员身份或身份验证提供商?

时间:2009-05-27 21:43:23

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

有几种方法可以在ASP.net网站上使用OpenID,但是它们似乎都没有使用现有的成员资格和身份验证提供程序机制。

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

或者我会更深入一级并编写自己的FormsAuthenticationModule?这似乎有些过于简单,因为(据我所知),表单身份验证可以查找任何数据源。

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

由于这是针对ASP.net MVC应用程序的,因此如果有所不同,我就无法使用内置的Login WebForms控件。

6 个答案:

答案 0 :(得分:10)

ASP.NET定义的Membership API根本不适合OpenID,这可能是您没有看到很多系统使用它的原因。我还没有看到有必要使用OpenID的成员资格提供程序,所以它并没有真正成为一个问题。尝试使成员资格提供程序模型适合OpenID的一个项目是http://code.google.com/p/dotnet-membership-provider/,但它看起来不像最近维护的那样。

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

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

答案 1 :(得分:4)

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

即使你没有使用Login控件,仍然建议利用Membership Provider模型进行身份验证。

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

答案 2 :(得分:2)

这是一个老问题,但我没有看到我在搜索它时使用的方法,所以这里。 (它仅在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 ?? "/");

假设您还设置了成员资格和角色提供程序,则为相应的用户名设置表单Auth cookie,可以访问所有其他成员资格和角色。

答案 3 :(得分:0)

DotNetOpenId附带的ASP.NET MVC示例使用FormsAuthentication在OpenID对其进行身份验证后将用户登录。据我所知,它与会员系统没有任何整合。

答案 4 :(得分:0)

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

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

所以我在那里有一个app_code文件夹,我正在使用这个c#helper类 - 我可以将令牌恢复正常并且它将我带到我的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

堆栈追踪:

答案 5 :(得分:0)

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

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

我正在努力解决这个困境与facebook连接。我必须有一个用户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。在该处理程序中,您可以针对每种情况执行所有处理,用户已在提供者数据库中拥有帐户,用户在提供者数据库中没有帐户,因此我们创建一个帐户。所有那些整洁的废话:)

玩得开心。