私は、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)
簡単に言えば、メンバーのパスワードを使用せずにトークンを作成する方法が欲しいのです。
誰かがこれについて何らかの経験を持っていますか、または私が望むものをどのように手に入れることができるかについてのアイデアはありますか?
前もって感謝します。