2012-03-11 3 views
3

Я новый пользователь MVC 3, и я пытаюсь создать админ через базу данных SQL. Прежде всего, у меня есть объект Customer и администратор, который можно определить через поле admin, которое является логическим типом в объекте Customer. Я хочу сделать доступ к админе только на странице продукта, а не в обычном клиенте. И я хочу сделать [Авторизовать (Roles = "admin")] вместо [Авторизовать]. Однако я не знаю, как я могу сделать роль администратора в моем коде. Тогда в моем HomeController я написал этот код.MVC 3 Авторизовать собственные роли

public class HomeController : Controller 
{ 

    [HttpPost] 
    public ActionResult Index(Customer model) 
    { 
     if (ModelState.IsValid) 
     { 
      //define user whether admin or customer 
      SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["rentalDB"].ToString()); 
      String find_admin_query = "SELECT admin FROM Customer WHERE userName = '" + model.userName + "' AND admin ='true'"; 
      SqlCommand cmd = new SqlCommand(find_admin_query, conn); 
      conn.Open(); 
      SqlDataReader sdr = cmd.ExecuteReader(); 
      //it defines admin which is true or false 
      model.admin = sdr.HasRows; 
      conn.Close(); 

      //if admin is logged in 
      if (model.admin == true) { 
       Roles.IsUserInRole(model.userName, "admin"); //Is it right? 
       if (DAL.UserIsVaild(model.userName, model.password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.userName, true); 
        return RedirectToAction("Index", "Product"); 
       } 
      } 

      //if customer is logged in 
      if (model.admin == false) { 
       if (DAL.UserIsVaild(model.userName, model.password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.userName, true);     
        return RedirectToAction("Index", "Home"); 
       } 
      } 
       ModelState.AddModelError("", "The user name or password is incorrect."); 
     } 
     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

И класс DAL является

public class DAL 
{ 
    static SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["rentalDB"].ToString()); 

    public static bool UserIsVaild(string userName, string password) 
    { 
     bool authenticated = false; 
     string customer_query = string.Format("SELECT * FROM [Customer] WHERE userName = '{0}' AND password = '{1}'", userName, password);  
     SqlCommand cmd = new SqlCommand(customer_query, conn); 
     conn.Open(); 
     SqlDataReader sdr = cmd.ExecuteReader(); 
     authenticated = sdr.HasRows; 
     conn.Close(); 
     return (authenticated); 
    } 
} 

Наконец, я хочу сделать нестандартную [Авторизовать (Roles = "Admin")]

[Authorize(Roles="admin")] 
public class ProductController : Controller 
{ 
    public ViewResult Index() 
    { 
     var product = db.Product.Include(a => a.Category); 
     return View(product.ToList()); 
    } 
} 

Это мой исходный код в настоящее время. Должен ли я использовать класс AuthorizeAttribute? Если мне нужно сделать, как я могу это сделать? Не могли бы вы мне объяснить? Я не могу понять, как установить особую роль в моем случае. Пожалуйста, помогите мне, как я могу это сделать. Благодарю.

+1

Ваш код легко открыт для SQL-инъекции: String find_admin_query = "SELECT admin FROM Customer WHERE userName = '" + model.userName + "' AND admin = 'true'"; Что делать, если имя пользователя: '; удалить из пользователей; - –

ответ

1

Неправильное использование вашей информации о Role.IsInRole. То, что используется [Авторизовать (Roles = "Admin")], не нужно его вызывать.

В коде вы не устанавливаете роли в любом месте. Если вы хотите сделать пользовательский управление ролями вы можете использовать свой собственный поставщик роли или хранить их в токен аутентификации, как показано здесь:

http://www.codeproject.com/Articles/36836/Forms-Authentication-and-Role-based-Authorization примечание раздел:

 

// Get the stored user-data, in this case, user roles 
      if (!string.IsNullOrEmpty(ticket.UserData)) 
      { 
       string userData = ticket.UserData; 
       string[] roles = userData.Split(','); 
       //Roles were put in the UserData property in the authentication ticket 
       //while creating it 
       HttpContext.Current.User = 
        new System.Security.Principal.GenericPrincipal(id, roles); 
      } 
     } 
 

Однако простой подход здесь является используйте встроенное членство в asp.net. Создайте новый проект mvc, используя шаблон «интернет-приложение», и все это будет настроено для вас. В визуальной студии щелкните значок «asp.net configuration» над браузером решений. Здесь вы можете управлять ролями и назначать роли.

2

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

[System.AttributeUsage(System.AttributeTargets.All, AllowMultiple = false, Inherited = true)] 
public sealed class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     // Get the roles from the Controller action decorated with the attribute e.g. 
     // [AccessDeniedAuthorize(Roles = MyRoleEnum.UserRole + "," + MyRoleEnum.ReadOnlyRole)] 
     var requiredRoles = Roles.Split(Convert.ToChar(",")); 

     // Get the highest role a user has, from role provider, db lookup, etc. 
     // (This depends on your requirements - you could also get all roles for a user and check if they have the correct access) 
     var highestUserRole = GetHighestUserSecurityRole(); 

     // If running locally bypass the check 
     if (filterContext.HttpContext.Request.IsLocal) return; 

     if (!requiredRoles.Any(highestUserRole.Contains)) 
     { 
      // Redirect to access denied view 
      filterContext.Result = new ViewResult { ViewName = "AccessDenied" }; 
     } 
    } 
} 

Теперь декорировать контроллер с пользовательским атрибутом (вы также можете украсить индивидуальные действия контроллера):

[AccessDeniedAuthorize(Roles="user")] 
public class ProductController : Controller 
{ 
    [AccessDeniedAuthorize(Roles="admin")] 
    public ViewResult Index() 
    { 
     var product = db.Product.Include(a => a.Category); 
     return View(product.ToList()); 
    } 
} 
Смежные вопросы