有几种方法可以在ASP.net网站上使用OpenID,但是它们似乎都没有使用现有的成员资格和身份验证提供程序机制。
我想知道创建一个完全依赖OpenID的网站的正确方法是什么?继续使用表单身份验证,但实现了对OpenID进行查找的SqlMembershipProvider变体?
或者我会更深入一级并编写自己的FormsAuthenticationModule?这似乎有些过于简单,因为(据我所知),表单身份验证可以查找任何数据源。
或者是否有第三种方法,保留FormsAuthenticationModule但是让它对OpenID进行查找?
由于这是针对ASP.net MVC应用程序的,因此如果有所不同,我就无法使用内置的Login WebForms控件。
答案 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。在该处理程序中,您可以针对每种情况执行所有处理,用户已在提供者数据库中拥有帐户,用户在提供者数据库中没有帐户,因此我们创建一个帐户。所有那些整洁的废话:)
玩得开心。