Sharepoint 2010 在SharePoint 2010中验证没有密码的表单用户

Sharepoint 2010 在SharePoint 2010中验证没有密码的表单用户,sharepoint-2010,forms-authentication,dotnetopenauth,claims-based-identity,fba,Sharepoint 2010,Forms Authentication,Dotnetopenauth,Claims Based Identity,Fba,我正在为SharePoint 2010开发一个小项目,它将允许用户使用他们的OpenID进行身份验证(以后可能还会有更多) 它目前的工作原理是我有一个基于SQL的成员资格和角色提供者。我的登录页面使用DotNetOpenAuth向OpenID端点发送身份验证请求。如果得到肯定的响应,我会从OpenID角色读取电子邮件地址,并为拥有该电子邮件地址的MembershipUser创建一个会话(如果我知道他来自的端点)。如果该用户不存在,我将创建一个新的MembershipUser并将端点存储在comm

我正在为SharePoint 2010开发一个小项目,它将允许用户使用他们的OpenID进行身份验证(以后可能还会有更多)

它目前的工作原理是我有一个基于SQL的成员资格和角色提供者。我的登录页面使用DotNetOpenAuth向OpenID端点发送身份验证请求。如果得到肯定的响应,我会从OpenID角色读取电子邮件地址,并为拥有该电子邮件地址的MembershipUser创建一个会话(如果我知道他来自的端点)。如果该用户不存在,我将创建一个新的MembershipUser并将端点存储在comment属性中(这样您就不能简单地编辑自己的角色以作为另一个人的电子邮件地址登录)

这是可行的,但问题在于创建会话。我目前使用以下代码位执行此操作:

//authenticate
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url),userProvider,roleProvider,username,user.GetPassword());         
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);
但这一点只有在会员资格提供者不加密密码的情况下才起作用,因为一旦加密,我就不能读取用户的密码并在该方法中使用它

我希望找到一种让用户登录的方法,但我似乎找不到一种简单的方法

使用

只是创建了一个异常(我假设这是因为该方法适用于标准FBA,而不是基于声明的FBA,但我只是猜测。不过,内置的带有用户名和密码的FBA登录控件确实有效。)

长话短说,我想找到一种方法来为我的成员创建令牌,而不必使用他们的密码

有没有人在这方面有经验,或者知道我如何才能得到我想要的


提前谢谢。

如果其他人遇到同样的情况,我会说我是如何“解决”这个问题的

在专业环境中,您最有可能创建自己的会员资格提供商/安全令牌服务,这样您就可以在代码中请求令牌,而无需用户密码

在我的情况下(由于时间限制),我不能这样做,所以我采取了一种更简单的方法。我没有使用加密密码(通过IIS),而是使用哈希密码(在web.config中手动设置)。我还确保允许重置我的会员资格提供商的密码。然后,我使用以下代码发布令牌:

MembershipUser user = membershipProvider.GetUser(username, true);
if(user == null)
{
    //create new user here
}
string password = user.ResetPassword();
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url), membershipProviderName, roleProviderName, user.UserName, password, false);
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);            

实际上,这意味着表单用户在我每次登录时都会重置密码,但由于他从未实际使用过密码,所以问题并不大。它可以很好地在SharePoint中快速显示OpenID支持。

如果其他人遇到同样的情况,我会说我是如何“解决”这个问题的

在专业环境中,您最有可能创建自己的会员资格提供商/安全令牌服务,这样您就可以在代码中请求令牌,而无需用户密码

在我的情况下(由于时间限制),我不能这样做,所以我采取了一种更简单的方法。我没有使用加密密码(通过IIS),而是使用哈希密码(在web.config中手动设置)。我还确保允许重置我的会员资格提供商的密码。然后,我使用以下代码发布令牌:

MembershipUser user = membershipProvider.GetUser(username, true);
if(user == null)
{
    //create new user here
}
string password = user.ResetPassword();
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url), membershipProviderName, roleProviderName, user.UserName, password, false);
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);            
实际上,这意味着表单用户在我每次登录时都会重置密码,但由于他从未实际使用过密码,所以问题并不大。它运行良好,足以在SharePoint中快速显示OpenID支持

MembershipUser user = membershipProvider.GetUser(username, true);
if(user == null)
{
    //create new user here
}
string password = user.ResetPassword();
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url), membershipProviderName, roleProviderName, user.UserName, password, false);
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);