5

私がやりたいのは、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>
4

2 に答える 2

5

ExtendedMembershipProvider ではなく、SimpleMembershipProvider からプロバイダーを継承していたことがわかりました。SimpleMembershipProvider は ExtendedMembershipProvider を継承しているので問題ないと思っていたのですが、うまくいきませんでした。

プロバイダーを ExtendedMembershipProvider から継承するように変更すると、エラーはなくなりました。

于 2012-08-19T16:46:18.423 に答える
1

ユーザーを作成するための新しいアクションを作成した後、私も同じ問題を抱えていました....

アクションは...

public ActionResult CreateUsers()
{
string username = "blah blah auto create";
string password = "blah blah auto create";
WebSecurity.CreateUserAndAccount(username, password);
}

しかし、フィルター属性を追加する必要がありました

[InitializeSimpleMembership]
public ActionResult CreateUsers()
{
string username = "blah blah auto create";
string password = "blah blah auto create";
WebSecurity.CreateUserAndAccount(username, password);
}
于 2012-11-12T19:19:06.557 に答える