Простое членство mvc 4 запрашивает инициализацию, хотя оно

У меня есть пользовательская таблица с именем «Клиент» с идентификатором клиента и электронной почтой в виде двух полей (среди прочего). Я хочу использовать это на сайте MVC4.
У меня есть единственная строка подключения с именем DBRuWho. В моем файле App_Start\AuthConfig.cs у меня есть метод CheckForSuperAdmin(), который заполнит мою таблицу начальным суперпользователем.

 internal static void CheckForSuperAdmin()
    {
        if (!WebMatrix.WebData.WebSecurity.Initialized)
        {
            WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DBRuWho", "customer", "customerId", "email", true);
        }

        var roles = new WebMatrix.WebData.SimpleRoleProvider();
        var users = new WebMatrix.WebData.SimpleMembershipProvider();
        if (!roles.RoleExists("SuperAdmin"))
        {
            roles.CreateRole("SuperAdmin");
            if (users.GetUser("[email protected]", false) == null)
            {
                users.CreateUserAndAccount("[email protected]", "P@ssw0rd53cR3t!");
                roles.AddUsersToRoles(new[] {"[email protected]"}, new[] {"SuperAdmin"});
            }
        }
    }

Когда я «Регистрирую пользователя», создается строка клиента, а также строка в таблице webpages_Membership, и обе они выглядят хорошо. Однако я могу зарегистрировать пользователя, только если я установлю точку останова в строке «var roles» выше и пропущу остальную часть метода.

Затем, с этим созданным пользователем, я не могу войти в систему - я получаю несоответствие пароля.

Если я НЕ пропускаю код, начинающийся с «var roles», я получаю исключение, которое: вы должны вызвать метод «WebSecurity.InitializeDatabaseConnection», прежде чем вызывать любой другой метод класса «WebSecurity».

Это расстраивает, так как вы можете ясно видеть, что я ДЕЙСТВИТЕЛЬНО вызываю этот метод. И после того, как он вызывается, я смотрю на него в своем окне Watch, и там говорится, что он инициализирован.

Итак, я застрял здесь.... Я хотел бы использовать это «Простое» членство, но, похоже, оно не позволяет мне использовать его просто!

Есть предположения? Я прочитал много статей, и кажется, что я все делаю правильно, но, очевидно, я что-то здесь упускаю...

Дополнительная информация: вот моя строка подключения, которая сопоставляется с DBRuWho.

 <connectionStrings>
<add name="DBRuWho" connectionString="Server=localhost;Database=ruwho;integrated security=true" providerName="System.Data.SqlClient" />

I am pretty sure I am connecting properly, because the data gets inserted! I just can't seem to get past the exception when I check for !roles.RoleExists and I cannot get logged in.

Обновление. Я удалил все данные из своей таблицы Customer и все данные из таблицы webpages_Membership, и теперь (если я пропущу код !roles.RoleExists при запуске), я МОГУ войти в систему.
Однако при попытке чтобы выполнить код ролей для создания моего суперадминистратора, я все еще получаю исключение, которое я отметил выше.


person twreynol    schedule 18.05.2013    source источник
comment
WebSecurity.InitializeDatabaseConnection все еще вызывается в InitialiseSimpleMembershipAttribute.cs?   -  person MattSull    schedule 18.05.2013
comment
Я закомментировал этот атрибут, поэтому приведенный выше код — единственное место, где он вызывается.   -  person twreynol    schedule 19.05.2013


Ответы (1)


Наконец нашел ответ. Именно так я создавал экземпляры провайдеров. Правильный способ, который работает:

public class Init
{
    const string SUPER_ADMIN_ROLE = "SuperAdmin";

    internal static void CheckForSuperAdmin()
    {
        if (!WebMatrix.WebData.WebSecurity.Initialized)
        {
            WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DBRuWho", "customer", "customerId", "email", true);
        }
        var roles = (SimpleRoleProvider)Roles.Provider;
        var users = (SimpleMembershipProvider)Membership.Provider;
        if (!roles.RoleExists(SUPER_ADMIN_ROLE))
        {
            roles.CreateRole(SUPER_ADMIN_ROLE);
            string email = "[email protected]";
            string pswd = "P@ssw0rd!";
            string credentials = API.Helpers.Misc.CreateCompanyCredential(pswd);
            if (users.GetUser(email, false) == null)
            {
                Dictionary<string, object> args = new Dictionary<string, object>()
                {
                    {"Name", email},
                    {"CustomerToken", Guid.NewGuid()},
                    {"Credentials",  credentials},
                    {"isActive",   true}
                };

                users.CreateUserAndAccount(email, pswd, args);
                roles.AddUsersToRoles(new[] { email }, new[] { SUPER_ADMIN_ROLE });
            }
        }
    }
}

Я нашел это в несколько похожем посте здесь, на S/O, ссылку на который я сразу же потерял (упс!)

Я включил другие атрибуты, которые мне нужно было отправить моему классу CUSTOMER, просто в качестве примера для чьей-то выгоды. Они не обязательно требуются.

Во всяком случае, я сделал три изменения, чтобы заставить это работать.

1) Убедитесь, что вы используете версию 2.0 Web.Matrix и Web.Matrix.data.

2) я добавил следующее в свой web.config

<membership defaultProvider="SimpleMembershipProvider">
  <providers>
    <clear />
    <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
  </providers>
</membership>
<roleManager defaultProvider="SimpleRoleProvider" enabled="true">
  <providers>
    <clear />
    <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
  </providers>
</roleManager>

3) Я сделал изменение кода, указанное выше.

Я сделал это все в этом порядке, и после № 3 он начал работать. Ура! Я публикую это на случай, если какая-то другая бедная ничего не подозревающая душа попытается найти новых провайдеров....

person twreynol    schedule 19.05.2013