質問
SharePoint 2010にFBA(クレームベースの認証)を実装しました。以下が実装されています。
- カスタムログインページ
- カスタムサインインページ
- パスワードリカバリページ(Porterpassword.aspx)
forgatePasswordページでは、ユーザーはメールアドレスを入力するように求められます。サインイン中に使用し、背後にあるコードでこのメールを使用してメンバーシップを使用してユーザー名を取得し、このユーザー名をメンバーシップに渡してgetuser関数に渡します。メールで送信されるユーザーの資格情報。
しかし、現在、コードは「関数は実装されていない」という例外としてスローされます。不思議なんだけど;カスタムメンバーシッププロバイダーを作成する必要があるカスタムデータベースは使用していません。その後、なぜこのエラーが発生しているのですか。誰かが手がかりを持っているか、同様の問題に直面しているかどうかを教えてください。ありがとう。
よろしく、水田
解決
FBAがSharePoint 2010用に構成されている場合、2つのメンバーシッププロバイダーがで定義されています web.config
ファイル - Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider
(通常は名前が付けられています 私) と System.Web.Security.SqlMembershipProvider
(名前が付けられました fbamembership この場合)。 FBA認証が適切に機能するためには、デフォルトのメンバーシッププロバイダーを前者に設定する必要があります(つまり、SharePointの主張1つ)。
ラインが含まれる場合 Membership.GetUserNameByEmail(...)
実行されると、デフォルトのメンバーシッププロバイダーが使用され、結果として SPClaimsAuthMembershipProvider.GetUserNameByEmail
呼ばれています。 MSDN この方法はその方法です 内部使用のために予約されており、コードから直接使用することを意図していません そして、のコメントによると コミュニティコンテンツ スローするセクション NotImplementedException
.
のインスタンスを取得する必要があります SqlMembershipProvider
からのプロバイダー Membership.Providers
コレクションしてから電話をかけます GetUserNameByEmail
このインスタンスを使用したメソッド。
プロバイダーを設定するときにプレフィックスを使用します web.config
ファイルとこのようにそれらを取得します:
string applicationNamePrefix = "fbaProvider_";
MembershipProvider fbaProvider;
foreach (MembershipProvider provider in Membership.Providers)
{
if (provider.ApplicationName.StartsWith(applicationNamePrefix, StringComparison.InvariantCultureIgnoreCase))
{
fbaProvider = provider;
}
}
throw new InvalidOperationException("Appropriate provider was not found.");