【问题标题】:Authorize Attribute Not Working with Roles MVC C#授权属性不适用于角色 MVC C#
【发布时间】:2011-05-17 23:20:37
【问题描述】:

我现在正在修改一个用 c# MVC 编写的系统。

我刚刚在管理员区域中构建了一个额外的功能,允许管理员创建一个具有有限管理员功能的用户帐户。对于新功能,我在每个控制器上添加了以下内容:

[Authorize(Roles = "Administrator")]

但是,如果我使用受限管理员帐户登录并导航到此页面,它可以让我通过。

我很困惑,因为我似乎以正确的方式做这件事,但我对 MVC 也很陌生,还有什么我可以检查的吗?我没有更改 web.config 文件中的任何内容,所以应该没问题。

我知道上面的信息有限,不是在寻找现成的解决方案,更多关于我可以检查以纠正问题的建议。

谢谢

编辑:

这就是新角色/帐户的创建方式。也放轻松,这是第一次尝试,没有太多验证。

[Authorize(Roles = "Administrator")]
    [HttpPost]
    public ActionResult AddSalesManager(App.Web.Areas.Administrator.Models.SalesManager model, FormCollection formValues)
    {
        if (formValues["Cancel"] != null)
        {
            return RedirectToAction("Index");
        }

        if (!string.Equals(model.password, model.confirmpassword))
        {
            ModelState.AddModelError("password", "Password and Confirmation must match");
        }

        if (ModelState.IsValid)
        {
            using (ModelContainer ctn = new ModelContainer())
            {
                // First, create the user account inside the ASP.Net membership system.
                //

                Membership.ApplicationName = "App";
                Roles.ApplicationName = "App";

                if (!Roles.RoleExists("LimitedAdmin"))
                    Roles.CreateRole("LimitedAdmin");

               // MembershipCreateStatus createStatus = MembershipService.CreateUser(model.email, model.password, model.email);
                if (Membership.GetUser(model.email) == null)
                {
                    Membership.CreateUser(model.email, model.password);
                    Roles.AddUserToRole(model.email, "LimitedAdmin");
                }

            }
        }
        return RedirectToAction("Index");

    }

【问题讨论】:

  • 发布您如何设置角色会有所帮助。
  • 用户是否有多个角色?
  • @jfar。不,用户只是被分配了 LimitedAdmin 角色。

标签: asp.net-mvc authorization roles


【解决方案1】:

您对这段代码有什么期望?

使用此属性,您可以让所有具有管理员角色的用户都有权执行此控制器操作,无论帐户有多大限制。

【讨论】:

  • 是的,但是我创建了一个名为 LimitedAdmin 的新角色,我希望它不会被允许进入系统的这个区域,但是它允许我使用这个帐户/角色。
  • 这两个角色中的用户是包括还是仅在 LimitedAdmin 角色中?
  • 我更新了我的代码来说明我是如何创建受限管理员帐户的。
  • 您是否使用您在此操作方法中创建的用户登录?我的意思是,您创建一个新用户并将该用户添加到角色“LimitedAdmin”。你下一步做什么?
  • @Mariusz,我创建帐户后,退出管理员帐户,并使用 LimitedAdmin 帐户登录。它允许我进入设置不正确的 [Authorize(Roles = "Administrator")] 的区域。
【解决方案2】:

角色属性

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class PermissionsAttribute : ActionFilterAttribute
{
    private readonly PermissionsType required;

    public PermissionsAttribute()
    {
    }

    public PermissionsAttribute(PermissionsType required)
    {
        this.required = required;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Log("OnActionExecuting", filterContext.RouteData);

        HttpSessionStateBase session = filterContext.HttpContext.Session;
        Controller controller = filterContext.Controller as Controller;

        //This is uesd to  redirect to same controller but differnect action
        // controller.HttpContext.Response.Redirect("./Login");

        var rjasthan = filterContext;


        var URK = filterContext.HttpContext.Request.RawUrl;
        if (session["UserPermissions"] != null)
        {
            if (!CheckPermissions((UserPermission)session["UserPermissions"]))
            {
                // this is used to signout from sesssion
                //  filterContext.HttpContext.GetOwinContext().Authentication.SignOut();

                filterContext.Controller.TempData["AuthenticationMessages"] = "You are not authorized to access";

                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary{
                             { "controller", "Home" },{ "action", "UnAuthorizeAccess" }});

            }
        }

        base.OnActionExecuting(filterContext);

    }

    protected bool CheckPermissions(UserPermission model)
    {
        bool result = false;

        if (this.required == (PermissionsType.Add))
        {
            if (model.AddRight)
                result = true;
        }
        else if (this.required == (PermissionsType.View))
        {
            if (model.ViewRight)
                result = true;
        }
        else if (this.required == (PermissionsType.Edit))
        {
            if (model.EditRight)
                result = true;
        }
        else if (this.required == (PermissionsType.Delete))
        {
            if (model.DeleteRight)
                result = true;
        }
        else if (this.required == (PermissionsType.View | PermissionsType.Edit))
        {
            if (model.ViewRight && model.EditRight)
            {
                result = true;
            }
        }
        else if (this.required == (PermissionsType.Add | PermissionsType.Edit))
        {
            if (model.AddRight && model.EditRight)
            {
                result = true;
            }
        }


        return result;
    }

    private void Log(string methodName, RouteData routeData)
    {
        var controllerName = routeData.Values["controller"];
        var actionName = routeData.Values["action"];
        var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
        Debug.WriteLine(message, "Action Filter Log");
    }
}

[Flags]
public enum PermissionsType
{
    View = (1 << 0),
    Add = (1 << 1),
    Edit = (1 << 2),
    Delete = (1 << 3),
    Admin = (View | Add | Edit | Delete)
}



 [Permissions(PermissionsType.Add)]
    public ActionResult Register()
    {
        return this.AjaxableView();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2014-10-28
    • 2014-05-08
    • 2020-03-13
    相关资源
    最近更新 更多