1

私は、SharePoint 2010 の小さなプロジェクトに取り組んでおり、ユーザーが OpenID で認証できるようにします (今後さらに追加される可能性があります)。

現在の仕組みは、SQL に基づくメンバーシップとロール プロバイダーを持っていることです。私のログイン ページは、DotNetOpenAuth を使用して認証要求を OpenID エンドポイントに送信します。肯定的な応答が得られた場合は、OpenID ペルソナから電子メール アドレスを読み取り、その電子メール アドレスを持つ MembershipUser のセッションを作成します (彼のエンドポイントがわかっている場合)。そのユーザーが存在しない場合は、新しい MembershipUser を作成し、エンドポイントをコメント プロパティに保存します (これにより、自分のペルソナを単純に編集して、別の人の電子メール アドレスとしてログインすることができなくなります)。

これは機能しますが、問題はセッションの作成にあります。私は現在、次のコードでこれを行っています。

//authenticate
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url),userProvider,roleProvider,username,user.GetPassword());         
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);

しかし、このビットはメンバーシップ プロバイダーがパスワードを暗号化しない場合にのみ機能します。暗号化すると、ユーザーのパスワードを読み取ってその方法で使用することができないためです。

ユーザーがログインできるようにする方法を見つけたいと思っていましたが、それを行う簡単な方法が見つからないようです。

使用する

FormsAuthentication.SetAuthCookie(username, false);

例外を作成するだけです(これは、その方法が標準の FBA 用であり、クレームベースの FBA 用ではないためだと思いますが、推測しているだけです。ただし、ユーザー名とパスワードを使用した組み込みの FBA ログインコントロールは機能します。)

System.ArgumentException: Exception of type 'System.ArgumentException' was thrown.  Parameter name: encodedValue   
 at Microsoft.SharePoint.Administration.Claims.SPClaimEncodingManager.DecodeClaimFromFormsSuffix(String encodedValue)    
 at Microsoft.SharePoint.Administration.Claims.SPClaimProviderManager.GetProviderUserKey(String encodedSuffix)    
 at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(SPSite site, String name, Boolean bNotGlobalAdminCode, String strUrl, Boolean bNotAddToContext, Byte[] UserToken, String userName, Boolean bIgnoreTokenTimeout, Boolean bAsAnonymous)    
 at Microsoft.SharePoint.SPWeb.InitializeSPRequest()    
 at Microsoft.SharePoint.WebControls.SPControl.EnsureSPWebRequest(SPWeb web)    
 at Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl(HttpContext context)    
 at Microsoft.SharePoint.ApplicationRuntime.BaseApplication.Application_PreRequestHandlerExecute(Object sender, EventArgs e)    
 at Microsoft.SharePoint.ApplicationRuntime.SPRequestModule.PreRequestExecuteAppHandler(Object oSender, EventArgs ea)    
 at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()    
 at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

簡単に言えば、メンバーのパスワードを使用せずにトークンを作成する方法が欲しいのです。

誰かがこれについて何らかの経験を持っていますか、または私が望むものをどのように手に入れることができるかについてのアイデアはありますか?

前もって感謝します。

4

1 に答える 1

1

他の誰かが同じ状況に陥った場合に備えて、私がどのように問題を「解決」したかを述べます。

プロフェッショナルな環境では、ユーザーのパスワードを必要とせずにコードでトークンを要求できるように、独自のメンバーシップ プロバイダー/セキュリティ トークン サービスを作成する可能性が高くなります。

私の場合(時間の制約により)それができなかったので、より簡単な方法を取りました。暗号化されたパスワードを (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 サポートをすぐに示すのに十分なほどうまく機能します。

于 2012-05-10T07:10:50.263 に答える