Pregunta

Soy nuevo usuario de MVC 3 y estoy tratando de hacer administrador a través de la base de datos SQL. En primer lugar, tengo entidad y administrador de clientes a través del campo de administración, que es un tipo booleano en la entidad del cliente. Quiero hacer para acceder al administrador solo en la página del producto, no el cliente normal. Y quiero hacer [Autorizar (roles="admin")] en lugar de [Autorizar]. Sin embargo, no sé cómo puedo hacer realidad el papel de administrador en mi código. Luego, en mi HomeController, escribí este código.

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);
    }

y la clase de dal es

 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);
    }
}

Finalmente, quiero hacer que lo personalice [Autorizar (roles="admin")]

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

Estos son mi código fuente ahora.¿Necesito hacer clase 'AutorizEatTribute'? Si tengo que hacer, ¿cómo puedo hacerlo?¿Podrías explicarme?No puedo entender cómo establecer un papel en particular en mi caso. Por favor, ayúdame, ¿cómo puedo hacerlo?Gracias.

¿Fue útil?

Solución

Su rol.Esi-Inrole Usage no es correcto.Eso es lo que el [Autorizar (roles="admin")] se usa para, sin necesidad de llamarlo.

En su código, no está configurando los roles en ningún lugar.Si desea realizar una administración de roles personalizada, puede usar su propio proveedor de roles o almacenarlos en el token de autenticación, como se muestra aquí:

http://www.codeproject.com/Artículos / 36836 / Formularios-Autenticación y autorización basada en roles Note la sección:


// 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);
            }
        }


Sin embargo, un enfoque más fácil aquí es usar la membresía incorporada en ASP.NET. Cree un nuevo proyecto MVC usando la plantilla 'Aplicación de Internet' y todo esto será configurado para usted.En Visual Studio, haga clic en el icono "ASP.NET Configuración" sobre la solución Explorer.Puede administrar los roles aquí y la asignación a los roles.

Otros consejos

Sé que esta pregunta es un poco vieja, pero aquí está cómo hice algo similar.Creé un atributo de autorización personalizado que solía verificar si un usuario tuvo el acceso correcto de seguridad:

[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" };
        }
    }
}

Ahora decore el controlador con el atributo personalizado (también puede decorar acciones de controlador individual):

[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());
    }
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top