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)
我有一个名为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)
您可以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 文件中执行此操作,这样只需执行一次。
| 归档时间: |
|
| 查看次数: |
15292 次 |
| 最近记录: |