ASP.NET MVC:从变量设置Authorize属性Role时出现问题,需要const

tsq*_*rio 15 c# asp.net-mvc authorization

我在从变量设置Authorize属性Role值时遇到问题.错误消息表明它需要一个const变量.当我创建一个const类型变量时,它工作正常,但我试图从Web.Config文件或其他任何允许最终用户设置此值的文件中加载该值.我正在使用集成的Windows身份验证,因为这是一个仅限Intranet的应用程序.

有没有办法从控制器检查用户角色?我将在if语句中使用它来进行身份验证而不是属性.

[Authorize(Roles = Config.GMPUser)]
public ActionResult Index()
   {
      return View();
   }
Run Code Online (Sandbox Code Playgroud)

bra*_*ter 7

我有一个名为StringResources的类,它提供对静态字符串值的访问.我遇到了同样的问题并以下列方式解决了问题.我从AuthorizeAttribute类继承并为AuthorizeCore方法添加了方法覆盖.该方法的功能调用了IsInRole()并传入静态字符串属性.这就是诀窍.唯一的问题是必须为每个角色创建单独的类(或者以业务逻辑规定的任何方式为角色组合创建).

public class SystemAdministratorAuthorizationRequiredAttribute
        : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(System.Security.Principal.IPrincipal user)
        {
            return
                user.IsInRole(
                StringResources.AdministrationViewsStrings.SystemAdministratorRoleName
                );
        }
    }
Run Code Online (Sandbox Code Playgroud)


tva*_*son 2

您可以User.InRole( "RoleName" )在控制器内使用。

编辑:下面的代码将不起作用,因为 GetCustomAttributes() 显然返回每个属性的副本而不是对实际属性的引用。留下作为答案,为其他答案提供上下文。

至于在authorize属性中设置它,我唯一的想法是将其设置为属性定义中的空字符串,然后使用控制器类型的反射来获取和修改与AuthorizeAttribute对应的CustomAttribute属性(即,您关心的每个方法的类型为 AuthorizeAttribute 的那个。您应该能够以这种方式将 Roles 属性设置为您的配置项。

var attributes = typeof(MyController).GetMethod("Index")
                                     .GetCustomAttributes(typeof(AuthorizeAttribute),
                                                          false)
                 as AuthorizeAttribute;

attributes[0].Roles = Config.GMPUser;
Run Code Online (Sandbox Code Playgroud)

我想您会在应用程序启动时在 Global.asax 文件中执行此操作,这样只需执行一次。