c# - 如何在 [Authorize(Roles ="")] 中使用变量

标签 c# asp.net-mvc

我有一个 MVC 5 C# Intranet Web 应用程序,我们在其中使用了 30 多个 Active Directory 角色,并且由于业务文化的原因,权限经常发生变化。

为了方便我自己,我想我会尝试这样的事情来确定允许谁访问 Controller 操作或子操作。

/* This function runs a LINQ query and outputs a comma delimited string of 
   approved active directory roles.
*/

    private static string _approvedRoles = 
            Helpers.QueryableExtensions.GetApprovedRoles("FourCourseAudit");

    // GET: FourCourseAudits    
    [Authorize(Roles = _approvedRoles)]
    public ActionResult Index(string searchBy="All", 
          string orderBy="Campus", string orderDir="Asc")
    {

    // and so on... 

不幸的是,我得到了这个编译时错误:属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

这就是我在尝试使用 _approvedRoles 变量的其他方法(例如 public const stringpublic string)后所处的位置。我将 GetApprovedRoles 函数放在模型中、存储库(它现在所在的位置)和 Controller 主体中。

我知道角色很好,因为如果我使用这个:[Authorize(Roles="DOMAIN\Role1,DOMAIN\Role2")] 它会起作用。这对我来说不是一个可行的选择,因为角色会改变,而且这是一个非常大的 MVC 站点。有什么方法可以让角色成为变量吗?

最佳答案

参数需要在编译时知道,但您的查询发生在运行时。

最简单的方法是创建一个 custom AuthorizeAttribute .在 Authorize() 方法中,您可以进行任何您想要的检查,包括查询数据库。如果您希望更灵活地重用属性,您还可以将自定义参数传递到构造函数中。例如:

public class RoleAuthorizeAttribute : AuthorizeAttribute
{
    // or inject it
    private DbContext _db = new DbContext();

    private string _filter;

    public RoleAuthorizeAttribute(string filter)
    {
        _filter = filter;
    }

    /// <summary>
    /// Check authorization
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var currentUser = HttpContext.Current.User;

        // do some checks, query a database, whatever
        string approvedRoles =  Helpers.QueryableExtensions.GetApprovedRoles(_filter);

        if (!currentUser.IsInRole(...))
        {
            filterContext.Result = new RedirectToRouteResult("Error", new RouteValueDictionary());
        }
    }
}

并使用:

[RoleAuthorize("FourCourseAudit")]

关于c# - 如何在 [Authorize(Roles ="")] 中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31704629/

相关文章:

c# - 有没有办法在 C# 中使用 XML 轴属性?

c# - Windows 身份验证不接受凭据

C# - 在单次运行中匹配多个案例

c# - 如何从 anchor 中的 href 调用 MVC 操作方法?

c# - 使用属性和约定路由

c# - 类型 'System.IDisposable' 在未引用的程序集中定义

c# - SQL DataReader 网络使用限制

ASP.NET MVC 站点在 AWS ELB 后面无法正常工作

javascript - 有什么办法可以获取在outlook上点击链接的人的电子邮件地址

c# - 通过 JQuery 访问 Controller