Question

Je suis nouvel utilisateur MVC 3 et j'essaie de faire admin à travers la base de données SQL. Tout d'abord, j'ai une entité client et un administrateur peut être défini via un champ administrateur qui est le type booléen dans l'entité client. Je veux faire pour accéder à l'administrateur uniquement dans la page de produit, pas de client normal. Et je veux faire [Autoriser (Roles="Admin")] au lieu de [Autoriser]. Cependant, je ne sais pas comment puis-je faire un rôle d'administrateur dans mon code vraiment. Puis dans mon homécarrostrôleur, j'ai écrit ce code.

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

et dal classe est

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

Enfin, je veux faire personnalisé [autoriser (rôles="admin")]

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

Ce sont mon code source maintenant.Dois-je faire une classe «autorisateur»? Si je dois faire, comment puis-je le faire?Pourriez-vous m'expliquer?Je ne comprends pas comment définir un rôle particulier dans mon cas. S'il vous plaît aidez-moi comment puis-je faire.Merci.

Était-ce utile?

La solution

Votre rôle.L'utilisation n'est pas correct.C'est ce que le [Autoriser (roles="admin")] est utilisé pour, pas besoin de l'appeler.

Dans votre code, vous ne définissez pas les rôles n'importe où.Si vous souhaitez effectuer une gestion de rôle personnalisée, vous pouvez utiliser votre propre fournisseur de rôle ou les stocker dans le jeton Auth, comme indiqué ici:

http://www.codeproject.com/Articles / 36836 / Formulaires - Authentification - Autorisation basée sur le rôle Notez la section:


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


Cependant, une approche plus facile ici est d'utiliser l'appartenance intégrée dans ASP.NET. Créez un nouveau projet MVC à l'aide du modèle 'Application Internet' et cela sera tous configuré pour vous.Dans Visual Studio, cliquez sur l'icône «Asp.net Configuration» ci-dessus Solution Explorateur.Vous pouvez gérer des rôles ici et attribution aux rôles.

Autres conseils

Je sais que cette question est un peu vieux mais voici comment j'ai fait quelque chose de similaire.J'ai créé un attribut d'autorisation personnalisé que j'ai utilisé pour vérifier si un utilisateur avait l'accès de sécurité correct:

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

Décorez maintenant le contrôleur avec l'attribut personnalisé (vous pouvez également décorer des actions de contrôleur individuelles):

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top