2015-08-10 3 views
0

Я хотел бы управлять пользователями и ролями с членством ASP.NET MVC 5 по умолчанию в файле базы данных LocalDB в папке app_data. Это автоматически создается, если оно не существует.Как использовать роли в веб-приложении ASP.NET MVC 5 с LocalDB?

Я написал редактор роль, но при попытке применить роли к Web API следующим образом:

[Authorize(Roles= "SystemAdmin")] 

, менеджер роль пытается вызвать хранимую процедуру внутри базы данных.

Invalid object name 'dbo.aspnet_SchemaVersions'. 

Эта хранимая процедура, как правило, создается в полной базе данных членства SQL Server, созданный aspnet_regsql утилиты, однако утилита aspnet_regsql работает только на полную базу данных SQL Server, а не на базе LocalDB.

Есть ли способ сообщить провайдеру ролей не делать этот вызов хранимой процедуры без необходимости писать поставщик роли с нуля? Я мое подключение к базе данных определяется следующим образом -

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\DefaultConnection.mdf;Initial Catalog=aspnetdb;Integrated Security=True" providerName="System.Data.SqlClient" /> 

ответ

0

Я написал альтернативное решение - пользовательский RoleProvider, который работает с LocalDB.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using MyApp.Models; 

namespace MyAppNamespace 
{ 

    /// <summary> 
    /// The purpose of this role provider is to support membership + roles in a MSSQL LocalDB. 
    /// It works around the limitation of the standard SqlRoleProvider 
    /// which requires stored procedures in a SQL Server database. 
    /// </summary> 
    public class CustomRoleProvider : RoleProvider 
    { 
     public override string ApplicationName { get; set; } 


     public override string[] GetRolesForUser(string username) 
     { 
      using (var usersContext = new ApplicationDbContext()) 
      { 
       var user = usersContext.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 


       if (user == null) return new string[] { }; 

       var roles = from ur in user.Roles 
          from r in usersContext.Roles 
          where ur.RoleId == r.Id 
          select r.Name; 
       if (roles != null) 
        return roles.ToArray(); 
       else 
        return new string[] { }; 
      } 

     } 


     public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
     { 
      foreach(var userName in usernames) 
      { 
       var roles = GetRolesForUser(userName); 
       foreach(var roleName in roleNames) 
       { 
        if (!roles.Contains<string>(roleName)) 
        { 
         using (var usersContext = new ApplicationDbContext()) 
         { 
          var user = usersContext.Users.FirstOrDefault(u => u.UserName.Equals(userName, StringComparison.CurrentCultureIgnoreCase)); 
          if (user != null) 
          { 
           var role = usersContext.Roles.FirstOrDefault(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
           if (role != null) 
           { 
            var userRole = new Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole(); 
            userRole.RoleId = role.Id; 
            userRole.UserId = user.Id; 
            user.Roles.Add(userRole); 
           } 
          } 
          usersContext.SaveChanges(); 
         } 
        } 
       } 
      } 
     } 


     public override string[] GetAllRoles() 
     { 
      using (var usersContext = new ApplicationDbContext()) 
      { 
       return usersContext.Roles.Select(r => r.Name).ToArray(); 
      } 
     } 


     public override bool IsUserInRole(string username, string roleName) 
     { 
      return this.GetRolesForUser(username).Contains(roleName); 
     } 

     public override void CreateRole(string roleName) 
     { 
      var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole(); 
      role.Id = Guid.NewGuid().ToString(); 
      role.Name = roleName; 

      using (var usersContext = new ApplicationDbContext()) 
      { 
       usersContext.Roles.Add(role); 
       usersContext.SaveChanges(); 
      } 

     } 

     public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
     { 
      var usersInRole = GetUsersInRole(roleName); 
      if (throwOnPopulatedRole) 
      { 
       if (usersInRole.Length > 0) 
       { 
        throw new Exception("Role " + roleName + " is not empty"); 
       } 
      } 

      var roleNameArray = new string[1]; 
      roleNameArray[0] = roleName; 
      RemoveUsersFromRoles(usersInRole, roleNameArray); 

      using (var usersContext = new ApplicationDbContext()) 
      { 
       var role = usersContext.Roles.FirstOrDefault(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
       if (role != null) 
       { 
        usersContext.Roles.Remove(role); 
        usersContext.SaveChanges(); 
        return true; 
       } 
       return false; 
      } 

     } 

     public override bool RoleExists(string roleName) 
     { 
      using (var usersContext = new ApplicationDbContext()) 
      { 
       var role = usersContext.Roles.FirstOrDefault(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
       return (role != null); 
      } 
     } 


     public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) 
     { 

      foreach (var userName in usernames) 
      { 
       var roles = GetRolesForUser(userName); 
       foreach (var roleName in roleNames) 
       { 
        if (!roles.Contains<string>(roleName)) 
        { 
         using (var usersContext = new ApplicationDbContext()) 
         { 
          var user = usersContext.Users.FirstOrDefault(u => u.UserName.Equals(userName, StringComparison.CurrentCultureIgnoreCase)); 
          if (user != null) 
          { 
           var role = usersContext.Roles.FirstOrDefault(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
           if (role != null) 
           { 
            var userRole = new Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole(); 
            userRole.RoleId = role.Id; 
            userRole.UserId = user.Id; 
            user.Roles.Remove(userRole); 
           } 
          } 
          usersContext.SaveChanges(); 
         } 
        } 
       } 
      } 
     } 

     public override string[] GetUsersInRole(string roleName) 
     { 
      using (var usersContext = new ApplicationDbContext()) 
      { 
       var role = usersContext.Roles.FirstOrDefault(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 

       var users = from ur in role.Users 
          from u in usersContext.Users 
          where ur.RoleId == u.Id 
          select u.UserName; 
       if (users != null) 
        return users.ToArray(); 
       else 
        return new string[] { }; 
      } 
     } 


     public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
     { 
      var regEx = new System.Text.RegularExpressions.Regex(usernameToMatch); 

      using (var usersContext = new ApplicationDbContext()) 
      { 
       var role = usersContext.Roles.FirstOrDefault(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 

       var users = from ur in role.Users 
          from u in usersContext.Users 
          where ur.RoleId == u.Id 
          && regEx.IsMatch(u.UserName) 
          select u.UserName; 
       if (users != null) 
        return users.ToArray(); 
       else 
        return new string[] { }; 
      } 

     } 
    } 

} 
+0

Несомненно, тысячи людей должны написать эту же вещь, потому что для этого нет консервированного решения? – Mike

Смежные вопросы