0

我目前正在开发一个 C# MVC 项目。我曾经CustomAuthorizationAttribute授权我项目中的每个用户。

我有 3 个角色:超级管理员、管理员和用户

创建新用户时,有一个添加相应角色的选项,并且可以编辑(具有“用户”角色的人不能添加或编辑用户)。

为了设置此身份验证,我分别创建了两个表“ PermissionFunction ”和“ Permission ”。表格详情如下:

权限功能

|---------------------|------------------|
|   PermFunc_ID       |     bigint       |
|---------------------|------------------|
|   PermFunc_Name     |     varchar(50)  |
|---------------------|------------------|

权限

|---------------------|------------------|
|   Perm_ID           |      bigint      |
|---------------------|------------------|
|   Perm_RollID       |      bigint      |
|---------------------|------------------|
|   Perm_PermFuncID   |      bigint      |
|---------------------|------------------|

PermFunc_IDPerm_ID分别是表的主键。PermFunc_Name是引用所有控制器中每个操作的名称。Permission Table 包含RolePermissionFunction表的外键。

这里是我的角色表供参考:

|---------------------|------------------|
|   Rol_ID            |    bigint        |
|---------------------|------------------|
|   Rol_Name          |    varchar(50)   |
|---------------------|------------------|

对于身份验证,我添加了一个类CustomAuthorizationAttribute并为每个控制器操作添加了授权属性。

例如,考虑我的PermissionFunction表值如下:

|---------------------|-------------------|
|   PermFunc_ID       |    PermFunc_Name  |
|---------------------|-------------------|
|       1             |    userIndex      |
|---------------------|-------------------|
|       2             |    userCreate     |
|---------------------|-------------------|

和我的HomeController

public class UserController : Controller
{

    [CustomAuthorization(IdentityRoles = "userIndex")]
    public ActionResult Index()
    {
        return View();
    }

    [CustomAuthorization(IdentityRoles = "userCreate")]
    public ActionResult Create()
    {
        return View();
    }

}

CustomAuthorizationAttribute类:

public class CustomAuthorizationAttribute : AuthorizeAttribute
{
    private PermissionRepository _permission = new PermissionRepository();
    private PermissionFuncRepository _permissionFun = new PermissionFuncRepository();

    // roles start
    public string IdentityRoles
    {
        get { return _permissionName ?? String.Empty; }
        set { _permissionName = value; }
    }

    private string _permissionName;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        //do the base class AuthorizeCore first
        if (httpContext.User.Identity.IsAuthenticated)
        {
            string RoleID = FormsAuthentication.Decrypt(httpContext.Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name.Split('|')[1];

            var permisionID = _permissionFun.FindByName(_permissionName);

            if(permisionID != null)
            {
                var permis = _permission.GetPermission().Where(a => a.Perm_PermFuncID == permisionID.PermFunc_ID && a.Perm_RollID.ToString() == RoleID).FirstOrDefault();
                if (permis != null)
                {
                    return true;
                }
            }

        }
        return false;

    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {

        //if the user is not logged in use the deafult HandleUnauthorizedRequest and redirect to the login page
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        //if the user is logged in but is trying to access a page he/she doesn't have the right for show the access denied page
        else
        {
            // the controller action was invoked with an AJAX request
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new RedirectResult("~/Home/AccessDeniedNew");
            }
            else
            {
                filterContext.Result = new RedirectResult("~/Home/AccessDenied");
            }
        }
    }

}

这工作正常。


我的问题


这是我的索引html:

<button class="btn btn-sm btn-rounded btn-success" type="button" id ="CreateButton" onclick="UserCreate()"> Create New User </button> // create new user

   .....   // code continues

// code for modal popup
<div id="edit-user" class="modal hide fade" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">


</div>

<script type="text/javascript">

    function UserCreate() {
        var url = "/User/Create/";
            $.get(url, function (data) {
                $('#edit-user').html(data);
                $('#edit-user').modal('show');
           });
    }
</script>

CreateButton单击时,会出现一个模式弹出窗口,用于添加详细信息并创建新用户。


如果用户无权创建新用户,有什么办法可以隐藏创建新按钮。?(即:如果userCreate不在PermissionFunction表中)。

4

2 回答 2

0

如果需要,您可以检查权限并将按钮添加到页面。您已经知道获取权限信息的方法,因此您可以将一些信息存储在ViewDataor中ViewBag并检查是否应该存在创建按钮。这些信息可以只是一个简单的boolean. 会是这样的

@if(ViewBag.CanCreate)
{
    <button class="btn btn-sm btn-rounded btn-success" type="button" id ="CreateButton" onclick="UserCreate()"> Create New User </button>
}

CanCreate可以从控制器设置的位置。

于 2017-09-28T08:12:55.177 回答
0

我宁愿建议你从这个线程中获取想法

但是解决方案不是很优雅,您可以创建自己的操作链接,例如

@html.AuthorizeActionLink("button name","your action/controller name","your security role")

我认为您甚至可以摆脱最后一个参数并自动检查连接的用户和您调用的操作所需的权限是否选择显示它。

如果你真的需要特定的 html,那么我建议在这个线程中的解决方案 如果你想在一个页面上处理多个访问权限会更容易。事实上,如果你有很多 Viewbags 需要管理,那么 Viewbags 将开始变得很痛苦。

希望这可以帮助

问候

编辑:为了实现 authorizeActionLink 我发现了这个

于 2017-09-28T08:23:34.723 回答