对于一个项目,我正在制作一个mvc3 asp.net应用程序。我想要实现的功能之一是松散耦合的角色 - 动作归因。基本上,管理员用户应该能够创建角色并将其与操作链接起来。
角色本身存储在数据库中。
我想知道以下方法中的某些内容是否有效:
//Definition of a the Attribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyFlexibleAttribute : AuthorizeAttribute
{
private Repository RolesRepository = new Repository();
public String ActionName {get; set;}
public MyFlexibleAttribute()
{
Roles = RolesRepository.getStringRolesSeparatedByComma(ActionName)
}
}
// where in a random controller of a view, I could state
[MyFlexibleAttribute(ActionName = "SpecialAction"]
public ActionResult SpecialAction()
{
return View();
}
您有什么看法?
由于
的 的 *更新** 嗨,我最近在使用db context时发现了上述设计的一些可能的空洞。由于自定义属性的生命周期大于或等于控制器的生命周期,在实例化属性时调用新的存储库,可能会由于存储库的内部状态而导致可能的差异和安全漏洞(如果这使用例如dbContext )。
E.G。数据库已更新,新角色的新操作,但存储库未刷新...
在这种背景下看起来如何:
public ActionTypeName ActionTypeName {get; set;}
private Repository repo;
public CustomAuthorizeAction(ActionTypeName actionTypeName)
{
this.ActionTypeName = actionTypeName;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
//instantiate new instance when calling the OnAuthorization method
this.repo = new Repository();
List<Role> tmp = repo.getRolesLinkedToAction(this.ActionTypeName).ToList();
Roles = String.Join(",", tmp.Select(r => r.Name));
base.OnAuthorization(filterContext);
}
希望这会有所帮助
答案 0 :(得分:0)
是的,它会起作用,并且是您不想使用标准属性的字符串对它们进行硬编码的情况下实现动态角色的正确方法。