我有一个MVC 5 C#intranet Web应用程序,我们使用了30多个Active Directory角色,由于业务文化,权限通常是一个变化.
为了让自己变得简单,我想我会尝试这样的事情来确定谁可以访问控制器动作或子动作.
/* 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...
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到了这个编译时错误:An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.
这是我在尝试使用_approvedRoles变量的其他方法之后的地方,例如public const string和public string.我将GetApprovedRoles函数放在模型中,存储库中(现在是它),并放在控制器的主体中.
我知道角色很好,因为如果我使用它:[Authorize(Roles="DOMAIN\Role1,DOMAIN\Role2")]它有效.这对我来说不是一个可行的选择,因为角色会发生变化,这是一个非常大的MVC网站.有什么方法可以让角色成为变量吗?
mfa*_*nto 13
参数需要在编译时知道,但您的查询在运行时发生.
最简单的方法是创建自定义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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用:
[RoleAuthorize("FourCourseAudit")]
Run Code Online (Sandbox Code Playgroud)
对于任何想要的人来说,这都是一个简单的版本:
public class AuthorizeRolesAttribute : AuthorizeAttribute
{
public AuthorizeRolesAttribute(params string[] roles)
{
Roles = String.Join(",", roles);
}
}
Run Code Online (Sandbox Code Playgroud)
用法是:
[AuthorizeRoles(RoleConstant1,RoleConstant2)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7409 次 |
| 最近记录: |