【问题标题】:MVC 4 template with custom membership provider具有自定义成员资格提供程序的 MVC 4 模板
【发布时间】:2012-08-19 03:09:18
【问题描述】:

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

这行代码:

ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));

具体方法:

WebSecurity.GetUserId

正在抛出这个异常:

您必须调用“WebSecurity.InitializeDatabaseConnection”方法 在调用“WebSecurity”类的任何其他方法之前。这个电话 应该放在站点根目录下的 _AppStart.cshtml 文件中。

现在我无法调用 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>

【问题讨论】:

    标签: asp.net-membership asp.net-mvc-4 membership-provider webmatrix


    【解决方案1】:

    原来我的提供程序继承自 SimpleMembershipProvider 而不是 ExtendedMembershipProvider。我认为可以,因为 SimpleMembershipProvider 继承了 ExtendedMembershipProvider 但它不起作用。

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

    【讨论】:

    • 您是否能够“实施”OAuthWebSecurity?我注意到它不是一个抽象类,但希望有办法做到这一点。
    • 我最终没有使用 RavenDB,因为我们开始在 Azure 中托管并使用 SQL。当我让它工作时,我决定不实现 MembershipProvider 模型。试图让它发挥作用实在是太痛苦了。我们只是没有时间与之抗争。
    【解决方案2】:

    我也有同样的问题,在创建新的Action来创建用户之后......

    动作是……

    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);
    }
    

    【讨论】:

    • 这不会解决任何问题,因为我相信它需要一个 SQL Server 连接字符串
    • SimpleMembershipInitializer 过滤器接受 WebSecurity.InitializeDatabaseConnection() 中的连接字符串,我的问题不是它没有连接字符串,而是数据库没有被初始化为调用正在执行创建帐户。我将把它留在这里,因为它可能有助于其他人像我一样在 Google 上找到上述错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多