我目前正在开发一个 C# MVC 项目。我曾经CustomAuthorizationAttribute
授权我项目中的每个用户。
我有 3 个角色:超级管理员、管理员和用户
创建新用户时,有一个添加相应角色的选项,并且可以编辑(具有“用户”角色的人不能添加或编辑用户)。
为了设置此身份验证,我分别创建了两个表“ PermissionFunction ”和“ Permission ”。表格详情如下:
权限功能:
|---------------------|------------------|
| PermFunc_ID | bigint |
|---------------------|------------------|
| PermFunc_Name | varchar(50) |
|---------------------|------------------|
权限:
|---------------------|------------------|
| Perm_ID | bigint |
|---------------------|------------------|
| Perm_RollID | bigint |
|---------------------|------------------|
| Perm_PermFuncID | bigint |
|---------------------|------------------|
PermFunc_ID和Perm_ID分别是表的主键。PermFunc_Name是引用所有控制器中每个操作的名称。Permission Table 包含Role和PermissionFunction表的外键。
这里是我的角色表供参考:
|---------------------|------------------|
| 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表中)。