我想要做的是使用随Visual Studio 2012一起提供的默认MVC 4模板作为我的新项目的基础。但是,我想用自定义成员资格提供程序替换SQL提供程序,以便可以访问RavenDB来获取用户。我已经像以前一样实现了自定义提供程序,但是WebSecurity方法抛出以下异常。

这行代码:



具体的方法是:



抛出此异常:



现在,我无法调用InitializeDatabaseConnection,因为我的提供程序不是SQL提供程序。此方法需要一个SQL提供程序和一个SQL连接字符串。这是一个普遍的问题还是我错过了什么?为什么必须初始化WebSecurity?为什么要仅使用SQL提供程序将其连接?

我是否只需要更改代码以不使用WebSecurity类?

我整天都在这里,我很累。我希望我不要忽视一些简单的事情。也许再喝一杯朗姆酒和可乐会有所帮助。

更新: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>

最佳答案

原来,我的提供程序是从SimpleMembershipProvider继承而来的,而不是ExtendedMembershipProvider。我以为这是可以的,因为SimpleMembershipProvider继承了ExtendedMembershipProvider,但是它没有用。

将我的提供程序更改为从ExtendedMembershipProvider继承后,错误消失了。

关于asp.net-membership - 具有自定义成员资格提供程序的MVC 4模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12023924/

10-17 02:23