私がやりたいのは、VisualStudio2012に付属しているデフォルトのMVC4テンプレートを新しいプロジェクトのベースとして使用することです。ただし、SQLプロバイダーをカスタムメンバーシッププロバイダーに置き換えて、RavenDBにアクセスしてユーザーを取得できるようにします。以前と同じようにカスタムプロバイダーを実装しましたが、WebSecurityメソッドは次の例外をスローします。
このコード行:
ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
具体的には、方法は次のとおりです。
WebSecurity.GetUserId
この例外をスローしています:
「WebSecurity」クラスの他のメソッドを呼び出す前に、「WebSecurity.InitializeDatabaseConnection」メソッドを呼び出す必要があります。この呼び出しは、サイトのルートにある_AppStart.cshtmlファイルに配置する必要があります。
プロバイダーがSQLプロバイダーではないため、InitializeDatabaseConnectionを呼び出すことができません。このメソッドは、SQLプロバイダーとSQL接続文字列を想定しています。これは一般的な問題ですか、それとも何かが足りないのですか?WebSecurityを初期化する必要があるのはなぜですか?また、SQLプロバイダーを使用してのみ接続する必要があるのはなぜですか?
WebSecurityクラスを使用しないようにコードを変更する必要がありますか?
私は一日中これにいて、かなり疲れています。簡単なことを見逃していないことを願っています。たぶんもう1つのラム酒とコークスが役立つでしょう...
更新:2012年8月19日
GetUserIdメソッドを逆コンパイルしましたが、失敗する唯一の理由は、VerifyProvider呼び出しが原因であることがわかりました。
public static int GetUserId(string userName)
{
WebSecurity.VerifyProvider();
MembershipUser user = Membership.GetUser(userName);
if (user == null)
return -1;
else
return (int) user.ProviderUserKey;
}
private static ExtendedMembershipProvider VerifyProvider()
{
ExtendedMembershipProvider membershipProvider = Membership.Provider as ExtendedMembershipProvider;
if (membershipProvider == null)
throw new InvalidOperationException(WebDataResources.Security_NoExtendedMembershipProvider);
membershipProvider.VerifyInitialized();
return membershipProvider;
}
現在、VerifyProviderメソッドで失敗する唯一の理由は、メンバーシッププロバイダーでオーバーライドできないVerifyInitializedの呼び出しが原因です。また、プロバイダーを呼び出していない場合は、VerifyInitializedが処理されるときにどのコードが呼び出されているのかわかりません。
internal virtual void VerifyInitialized()
{
}
Web.Configの他のすべてのメンバーシッププロバイダーを削除します。少なくとも私はそうだと思います。これがエントリです。
<membership defaultProvider="RavenMembershipProvider">
<providers>
<clear />
<add name="RavenMembershipProvider" type="BigGunsGym.Infrastructure.Providers.RavenMembershipProvider" />
</providers>
</membership>