Как активировать "Роли" в ASP MVC4 SimpleMemberShip

Тема в разделе 'Заметки по ASP MVC', создана пользователем Sputnick, 30 окт 2013.

  1. Sputnick Администратор

    Репутация:
    58.920
    1. В Веб конфиге сайта добавляем:

    Код:
     <membership>
          <providers>
            <clear />
            <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="Entities2" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
          </providers>
        </membership>
        <roleManager enabled="true">
          <providers>
            <clear />
            <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="Entities2" applicationName="/" />
            <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
          </providers>
        </roleManager>
  2. Виолина

    Репутация:
    0
  3. Sputnick Администратор

    Репутация:
    58.920
    2. В аккаунт контролере при регистрации можно раздавать роли по кодовым словам:

    Код:
     
                        if (Code == "Хочу быть манагером")
                        {
                            Roles.AddUsersToRole(new[] { model.Email }, "Manager");
                        }
    //или
     //ПО УМОЛЧАНИЮ ВСЕМ НОВЫМ ЮЗЕРАМ РОЛЬ ЮЗЕР. ДАЛЬШЕ АДМИН В АДМИНКЕ МЕНЯЕТ ПО НЕОБХ                
                        Roles.AddUsersToRole(new[] { model.Email }, "User");
    
  4. Sputnick Администратор

    Репутация:
    58.920
    3. В аккаунт модели созданной по умолчанию, во первых все подсказки нужно переименовать. во вторых я в проектах вместо логина использую Email, потому как логин можно забыть, а свою почту вряд ли, прилагаю готовую модель:

    Код:
      [Table("UserProfile")]
        public class UserProfile
        {
            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public int UserId { get; set; }
            public string Email { get; set; }
        }
     
     
        public class RegisterExternalLoginModel
        {
            [Required]
            [Display(Name = "User name")]
            public string UserName { get; set; }
     
            public string ExternalLoginData { get; set; }
        }
     
        public class LocalPasswordModel
        {
            [Required]
            [DataType(DataType.Password)]
            [Display(Name = "Текущий пароль")]
            public string OldPassword { get; set; }
     
            [Required]
            [StringLength(100, ErrorMessage = "Пароль {0} должен быть не меньше чем {2} знаков.", MinimumLength = 6)]
            [DataType(DataType.Password)]
            [Display(Name = "Новый пароль")]
            public string NewPassword { get; set; }
     
            [DataType(DataType.Password)]
            [Display(Name = "Повторите пароль")]
            [Compare("NewPassword", ErrorMessage = "Пароль и повтор пароля не совпадают.")]
            public string ConfirmPassword { get; set; }
        }
     
        public class LoginModel
        {
            [Required]
            [Display(Name = "Адрес электронной почты")]
            public string Email { get; set; }
     
            [Required]
            [DataType(DataType.Password)]
            [Display(Name = "Пароль")]
            public string Password { get; set; }
     
            [Display(Name = "Запомнить?")]
            public bool RememberMe { get; set; }
        }
     
        public class RegisterModel
        {
            [Required]
            [Display(Name = "Адрес электронной почты")]
            public string Email { get; set; }
     
            [Required]
            [StringLength(100, ErrorMessage = "Пароль {0} должен быть не меньше чем {2} знаков.", MinimumLength = 6)]
            [DataType(DataType.Password)]
            [Display(Name = "Пароль")]
            public string Password { get; set; }
     
            [DataType(DataType.Password)]
            [Display(Name = "Повторите пароль")]
            [Compare("Password", ErrorMessage = "Пароль и повтор пароля не совпадают.")]
            public string ConfirmPassword { get; set; }
        }
     
        public class ExternalLogin
        {
            public string Provider { get; set; }
            public string ProviderDisplayName { get; set; }
            public string ProviderUserId { get; set; }
        }
  5. Sputnick Администратор

    Репутация:
    58.920
    Далее можно давать доступ методам в контролере по ролям:

    [Authorize(Roles = Constants.ROLE_OPER)]
    //или на несколько ролей:
    [Authorize(Roles = "Admin,Tech")]
  6. Sputnick Администратор

    Репутация:
    58.920
    В глобальные фильтры добавляем:
    filters.Add(new InitializeSimpleMembershipAttribute());

    с аккаунт контролера убираем:
    [InitializeSimpleMembership]

    ИЛИ (вариант выше правильней)

    В файле AuthConfig.cs нужно инициировать SimpleMemberShip:

    Код:
      public static class AuthConfig
        {
     
            private static SimpleMembershipInitializer _initializer;
            private static object _initializerLock = new object();
            private static bool _isInitialized;
     
     
            public static void RegisterAuth()
            {
                // Ensure ASP.NET Simple Membership is initialized only once per app start
                System.Threading.LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
     
                // To let users of this site log in using their accounts from other sites such as Microsoft, Facebook, and Twitter,
                // you must update this site. For more information visit http://go.microsoft.com/fwlink/?LinkID=252166
     
                //OAuthWebSecurity.RegisterMicrosoftClient(
                //    clientId: "",
                //    clientSecret: "");
     
                //OAuthWebSecurity.RegisterTwitterClient(
                //    consumerKey: "",
                //    consumerSecret: "");
     
                //OAuthWebSecurity.RegisterFacebookClient(
                //    appId: "",
                //    appSecret: "");
     
                //OAuthWebSecurity.RegisterGoogleClient();
            }
     
     
     
     
            private class SimpleMembershipInitializer
            {
                public SimpleMembershipInitializer()
                {
                    System.Data.Entity.Database.SetInitializer<UsersContext>(null);
     
                    try
                    {
                        using (var context = new UsersContext())
                        {
                            if (!context.Database.Exists())
                            {
                                // Create the SimpleMembership database without Entity Framework migration schema
                                ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                            }
                        }
     
                        WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("TimesDBConnection", "UserProfile", "id", "Email", autoCreateTables: false);
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                    }
                }
            }
     
     
        }
    как видно из комментариев, там же инициализация если вы регистрируете у себя на сайте через сторонние сервисы (гугл, твитер и т д)
  7. Evgeny Новичок

    Репутация:
    6.251
    Здравствуйте. Подскажите как сделать чтобы при входе на сайт пользователя с определённой ролью (например "курьер") он переходил не на стартовую страницу, а на предназначенную для этой роли. Желательно на примере.
    Последние данные очков репутации:
    Sputnick: 6.251 Очки 12 июн 2015
    Sputnick нравится это.
  8. Sputnick Администратор

    Репутация:
    58.920
    при успешном логине:
    Код:
    ...
    return RedirectToAction("Cabinet");
    

    Код:
    ...
    public ActionResult Cabinet()
    {
    //В ЗАВИСИМОСТИ ОТ РОЛИ РЕДИРЕКТ
    if (User.IsInRole(Constants.NAPR))
    {
    return RedirectToAction("DashNA", "TP");
    }
     
    if (User.IsInRole(Constants.TP))
    {
    return RedirectToAction("DashTP", "TP");
    }
     
    if (User.IsInRole(Constants.VALID))
    {
    return RedirectToAction("DashValidator", "TP");
    }
     
    if (User.IsInRole(Constants.COORD))
    {
    return RedirectToAction("DashCoordinator", "TP");
    }
     
    if (User.IsInRole(Constants.MANAG))
    {
                    return RedirectToAction("DashManager", "Manager");
    }
     
    if (User.IsInRole(Constants.ADM))
    {
    return RedirectToAction("DashAdmin", "TP");
    }
     
    if (User.IsInRole(Constants.BLOCK))
    {
    return RedirectToAction("Home", "UserBlocked");
    }
     
     
    else { return Content("ERROR LEVEL 1.1.1"); }
    }
    
    Последние данные очков репутации:
    Evgeny: 627 Очки 12 июн 2015
  9. Evgeny Новичок

    Репутация:
    6.251
    :) Спасибо. Все получилось как мне нужно было. У самого как-то ума не хватило сделать что-то похожее на
    public ActionResult Cabinet().

Поделиться этой страницей