C#属性:使用枚举常量作为输入参数
我正在尝试为我的MVC应用程序实现一种新的基于权限的访问方法;我们有几个权限组,每个组都包含一个权限列表。例如,我们有C#属性:使用枚举常量作为输入参数,c#,asp.net-mvc,custom-attributes,access-control,C#,Asp.net Mvc,Custom Attributes,Access Control,我正在尝试为我的MVC应用程序实现一种新的基于权限的访问方法;我们有几个权限组,每个组都包含一个权限列表。例如,我们有Invoices权限组,其中包含createinvoices、RemoveInvoice等权限密钥 在这种方法中,每个mvc操作都需要特定的执行权限。我正试图通过CustomAttributes实现这一点,比如: public class InvoiceController : Controller { [RequirePermission(Permiss
Invoices
权限组,其中包含createinvoices、RemoveInvoice等
权限密钥
在这种方法中,每个mvc操作都需要特定的执行权限。我正试图通过CustomAttributes实现这一点,比如:
public class InvoiceController : Controller
{
[RequirePermission(Permissions.Invoices.CreateInvoice)]
public ActionResult Create()
{
return View();
}
}
为了让开发人员更容易记住不同的权限组和权限键,我尝试创建一个预定义的权限列表,该列表应该是权限组和权限键的组合。但由于在C中使用属性参数时受到限制#
我还不能让它工作。(我不想创建一个超大的枚举器,并将所有权限键都放在其中)
我最后一次尝试是为每个权限组创建一个枚举器,然后在其中将权限键定义为枚举常量:
public class PermissionEnums
{
[PermissionGroup(PermissionGroupCode.Invoice)]
public enum Invoices
{
CreateInvoice = 1,
UpdateInvoice = 2,
RemoveInvoice = 3,
ManageAttachments = 4
}
[PermissionGroup(PermissionGroupCode.UserAccounts)]
public enum UserAccounts
{
Create = 1,
ChangePassword = 2
}
}
如您所见,这里有一组代码,使用PermissionGroup
属性指定的权限组键,以及在每个枚举常量上指定为数字代码的权限键代码
Requiremission属性定义如下:
public class RequirePermissionAttribute : Attribute
{
private Enum _Permission;
public RequirePermissionAttribute(Enum Permission)
: base()
{
_Permission = Permission;
}
}
但问题是Enum
类型的对象不能用作属性参数
感谢您的任何建议/想法我认为这是不可能的。我尝试过做您的事情,但失败了:/对不起
操作权限应与Authorize一起使用,您可以编写类似以下内容的ovveride:
[AttributeUsage(AttributeTargets.All)]
public sealed class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
throw new ArgumentNullException("httpContext");
//Its a piece of code from my app you can modify it to suit your needs or use the base one
if (!new CustomIdentity(httpContext.User.Identity.Name).IsAuthenticated)
{
return false;
}
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
}
}
然后,关于你的行动:
[CustomAuthorizeAttribute(Roles = "FE")]
public ActionResult Index()
{
return RedirectToAction("Index", "Documents");
}
但是,它仍然是您使用的字符串,要使其工作,您需要将其与自定义角色提供程序组合。我已经找到了解决方案,唯一需要改变的是结构参数的类型。您必须使用对象,而不是使用Enum
:
public class RequirePermissionAttribute : AuthorizeAttribute
{
private object _Permission;
public RequirePermissionAttribute(object Permission)
: base()
{
_Permission = Permission;
}
}
以下是完整的代码:
/***************** Permission Groups And Keys *****************/
public static class Permissions
{
[PermissionGroup(PermissionGroupCode.Invoice)]
public enum Invoices
{
CreateInvoice = 1,
UpdateInvoice = 2,
RemoveInvoice = 3,
ManageAttachments = 4
}
[PermissionGroup(PermissionGroupCode.UserAccounts)]
public enum UserAccounts
{
Create = 1,
ChangePassword = 2
}
}
public enum PermissionGroupCode
{
Invoice = 1,
UserAccounts = 2,
Members = 3
}
/***************** Attributes & ActionFilters *****************/
[AttributeUsage(AttributeTargets.Enum)]
public class PermissionGroupAttribute : Attribute
{
private PermissionGroupCode _GroupCode;
public PermissionGroupCode GroupCode
{
get
{
return _GroupCode;
}
}
public PermissionGroupAttribute(PermissionGroupCode GroupCode)
{
_GroupCode = GroupCode;
}
}
public class RequirePermissionAttribute : AuthorizeAttribute
{
private object _RequiredPermission;
public RequirePermissionAttribute(object RequiredPermission)
: base()
{
_RequiredPermission = RequiredPermission;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var permissionGroupMetadata = (PermissionGroupAttribute)_RequiredPermission.GetType().GetCustomAttributes(typeof(PermissionGroupAttribute), false)[0];
var groupCode = permissionGroupMetadata.GroupCode;
var permissionCode = Convert.ToInt32(_RequiredPermission);
return HasPermission(currentUserId, groupCode, permissionCode);
}
}
是的,我已经这样做了,但我的问题不是创建属性(ActionFilter属性)来检查用户权限。我只需要一种更好的方法(比使用普通字符串键)来创建预定义的权限常量。试试这个。