MVC 4模板与自定义成员资格提供程序

时间:2012-08-19 03:09:19

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

我想要做的是使用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>

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

在创建用于创建用户的新动作后,我也遇到了同样的问题....

行动是......

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

但它只需要过滤器attrib add

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