ASP.NET MVC3 и EF4.1 - Как настроить членство после запуска aspnet_regsql? - PullRequest
1 голос
/ 07 сентября 2011

Мне нужно внедрить в свое приложение для социальной сети настроенное членство и добавить информацию в обычные таблицы aspnet в существующей базе данных, такие как Страна, Провинция, Город, Дата рождения и т. Д. И т. Д. И т. Д. И т. П.

Я уже запустил aspnet_regsql, основываясь на этом посте Добавить таблицы членства ASP.NET в мою собственную существующую базу данных, или я должен вместо этого настроить отдельную базу данных членства ASP.NET? и уже пытался подписаться на этот пост http://msdn.microsoft.com/en-us/library/ms366730.aspx#Y342, но я получил некоторые ошибки сборки из переопределенных методов, и на самом деле я хотел бы найти любой пошаговый пример с использованием MVC 3 и EF4.1.

В любом случае, после запуска aspnet_regsql, что быбыть следующим шагом для реализации индивидуальных методов членства?Знаете ли вы какой-нибудь пошаговый (легкий) учебник, чтобы помочь мне?Спасибо, ребята!

Ответы [ 4 ]

2 голосов
/ 07 сентября 2011

Сохраните ваши дополнительные пользовательские данные в вашей собственной таблице пользователей.Сохраните любые дополнительные поля, которые вы хотите, и включите в себя одно поле, которое позволит вам связать запись с пользователем-участником.Держитесь подальше от таблиц членства и обращайтесь к ним только через поставщика членства, чтобы избежать каких-либо изменений, которые Microsoft может внести в будущем.

1 голос
/ 08 сентября 2011

Если вы хотите скачать какой-нибудь код, чтобы посмотреть, как это делается, вы можете взять nerdinner: http://nerddinner.codeplex.com/

Сначала вам нужно убедиться, что с настройкой web.config все в порядке

<connectionStrings>
     <add name="XXXXXMembership" connectionString="data source=.\SQLEXPRESS;Initial Catalog=corpiq_membership;User Id=corpiq; Password=c0rp1q; Persist Security Info=true;" providerName="System.Data.SqlClient" />
     <add name="CorpiqDb" connectionString="data source=.\SQLEXPRESS;Initial Catalog=corpiq;User Id=corpiq; Password=c0rp1q; Persist Security Info=true;" providerName="System.Data.SqlClient" />
  </connectionStrings>

<membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="XXXXXMembership"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true"
             maxInvalidPasswordAttempts="3" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="30"
             passwordStrengthRegularExpression="^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$" passwordFormat="Hashed" applicationName="/" />
      </providers>
    </membership>

Если все в порядке, вы сможете запустить инструмент настройки ASP.Net, с молотком (красным цветом) и планетой в верхней части проводника решений, когда находитесь на веб-сайте MVC.С помощью этих инструментов вы можете добавлять пользователей и роли.

После того, как вы сможете просто добавить эту строку в свой контроллер:

[Authorize(Roles = "Member, Delegate")]

И я бы предложил написать оболочку, которая вызывает метод Membershipтак что вы можете иметь свою собственную логику, вот моя:

public class AuthenticationService : IAuthenticationService
    {

        public bool IsValidLogin(string email, string password)
        {
            //Unlock user if it makes more than 30 minutes
            CheckLocked(email);
            return Membership.ValidateUser(email, password);
        }

        public void SignIn(string email, bool createPersistentCookie)
        {
            if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
            FormsAuthentication.SetAuthCookie(email, createPersistentCookie);
        }

        public void SignOut()
        {
            FormsAuthentication.SignOut();
        }

        public string GetLoggedInUserName()
        {
            return Membership.GetUser() != null ? Membership.GetUser().UserName : string.Empty;
        }

        public MembershipCreateStatus RegisterUser(string email, string password, string role)
        {
            MembershipCreateStatus status;
            Membership.CreateUser(email, password, email, Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), true, out status);

            if (status == MembershipCreateStatus.Success)
            {
                Roles.AddUserToRole(email, role);
            }
            return status;
        }

        public MembershipUserCollection GetAllUsers()
        {
            return Membership.GetAllUsers();
        }

        public string GeneratePassword()
        {
            var alphaCaps = "QWERTYUIOPASDFGHJKLZXCVBNM";
            var alphaLow = "qwertyuiopasdfghjklzxcvbnm";
            var numerics = "1234567890";
            var special = "@#$";
            var allChars = alphaCaps + alphaLow + numerics + special;
            var r = new Random();
            var generatedPassword = "";
            for (int i = 0; i < MinPasswordLength - 1; i++)
            {
                double rand = r.NextDouble();
                if (i == 0)
                {
                    //First character is an upper case alphabet
                    generatedPassword += alphaCaps.ToCharArray()[(int)Math.Floor(rand * alphaCaps.Length)];
                    //Next one is numeric
                    rand = r.NextDouble();
                    generatedPassword += numerics.ToCharArray()[(int) Math.Floor(rand*numerics.Length)];
                }
                else
                {
                    generatedPassword += allChars.ToCharArray()[(int)Math.Floor(rand * allChars.Length)];
                }
            }
            return generatedPassword;
        }

        public int MinPasswordLength
        {
            get
            {
                return Membership.Provider.MinRequiredPasswordLength;
            }
        }

        public string AdminRole
        {
            get { return "admin"; }
        }

        public string MemberRole
        {
            get { return "member"; }
        }

        public string DelegateRole
        {
            get { return "delegate"; }
        }

        public bool Delete(string email)
        {
            return Membership.DeleteUser(email);
        }

        public bool IsAdmin()
        {
            return Roles.IsUserInRole(AdminRole);
        }

        public bool IsMember()
        {
            return Roles.IsUserInRole(MemberRole);
        }

        public bool IsDelegate()
        {
            return Roles.IsUserInRole(DelegateRole);
        }

        public bool ChangePassword(string email, string oldPassword, string newPassword)
        {
            if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
            if (String.IsNullOrEmpty(oldPassword)) throw new ArgumentException("Value cannot be null or empty.", "oldPassword");
            if (String.IsNullOrEmpty(newPassword)) throw new ArgumentException("Value cannot be null or empty.", "newPassword");

            // The underlying ChangePassword() will throw an exception rather
            // than return false in certain failure scenarios.
            try
            {
                var currentUser = Membership.Provider.GetUser(email, true);
                return currentUser.ChangePassword(oldPassword, newPassword);
            }
            catch (ArgumentException)
            {
                return false;
            }
            catch (MembershipPasswordException)
            {
                return false;
            }
        }

        public string ResetPassword(string email)
        {
            if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
            var currentUser = Membership.Provider.GetUser(email, false);
            return currentUser.ResetPassword();
        }

        public bool CheckLocked(string email)
        {
            if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
            var currentUser = Membership.Provider.GetUser(email, false);
            if (currentUser == null) return false;
            if (!currentUser.IsLockedOut) return false;
            if (currentUser.LastLockoutDate.AddMinutes(30) < DateTime.Now)
            {
                currentUser.UnlockUser();
                return false;
            }
            return true;
        }

        public bool Unlock(string email)
        {
            if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
            var currentUser = Membership.Provider.GetUser(email, false);
            if (currentUser == null) return false;
            currentUser.UnlockUser();
            return true;
        }

        public void CheckRoles()
        {
            if (!Roles.RoleExists(MemberRole)) Roles.CreateRole(MemberRole);
            if (!Roles.RoleExists(AdminRole)) Roles.CreateRole(AdminRole);
            if (!Roles.RoleExists(DelegateRole)) Roles.CreateRole(DelegateRole);
        }
}

Я не совсем уверен, с какой частью вы не понимаете, но сообщите нам подробно, в чем ваши проблемы, и, возможно, мы могли бы помочь больше!Я думаю, вам нужно сначала создать свой код.

И вот хорошее начало для EF (так что вы можете написать свой собственный профиль / пользователя в своей собственной базе данных): http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

0 голосов
/ 08 сентября 2011

большое спасибо за все ваши ответы, все они были полезны для меня, я нашел эту ссылку, которая мне очень помогла, добавив информацию в ваши ответы, я хотел бы поделиться с сообществом, может быть, это может кому-то помочь еще:

http://www.java2s.com/Tutorial/ASP.NET/0420__Authentication-Authorization/UsingASPNETMembership.htm

0 голосов
/ 07 сентября 2011

Вы не помещаете такого рода вещи в Членство. Вы помещаете это в Профили или в свою собственную БД.

...