我想要做的是使用 Visual Studio 2012 附带的默认 MVC 4 模板作为我的新项目的基础。但是,我想用自定义成员提供程序替换 SQL 提供程序,这样我就可以访问我的 RavenDB 来获取我的用户。我已经像以前一样实现了自定义提供程序,但是 WebSecurity 方法抛出了以下异常。
这行代码:
ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
具体方法:
WebSecurity.GetUserId
正在抛出此异常:
在调用“WebSecurity”类的任何其他方法之前,您必须调用“WebSecurity.InitializeDatabaseConnection”方法。此调用应放置在站点根目录中的 _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>