Что я хочу сделать, так это использовать шаблон MVC 4 по умолчанию, который только что поставляется с Visual Studio 2012, в качестве основы для моего нового проекта. Однако я хочу заменить поставщика SQL на настраиваемый поставщик членства, чтобы я мог получить доступ к своей RavenDB, чтобы получить своих пользователей. Я реализовал пользовательский провайдер, как и раньше, но методы WebSecurity вызывают следующее исключение.
Эта строка кода:
ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
В частности, метод:
WebSecurity.GetUserId
Выдает это исключение:
You must call the "WebSecurity.InitializeDatabaseConnection" method before you call any other method of the "WebSecurity" class. This call should be placed in an _AppStart.cshtml file in the root of your site.
Теперь я не могу вызвать InitializeDatabaseConnection, потому что мой провайдер не является провайдером SQL. Этот метод ожидает поставщика SQL и строку подключения SQL. Это распространенная проблема или я что-то упускаю? Почему WebSecurity необходимо инициализировать и почему ожидается, что он будет подключаться только с использованием поставщика SQL?
Мне придется просто изменить код, чтобы не использовать класс WebSecurity?
Я был в этом весь день, и я очень устал. Надеюсь, я не упустил из виду что-то простое. Может быть, еще один ром с колой поможет...
Обновление :19.08.2012
Я декомпилировал метод 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>