我正在尝试保护满足一组条件的一组用户的 MVC 路由。由于 MVC 似乎大量使用属性,而 Steven Sanderson 在他的专业 MVC 书中使用了一个属性来实现安全可扩展性,因此我开始沿着这条路线走下去,但我想根据我所应用的操作来根据上下文定义规则。
有些行动仅适用于员工,有些则不然。
有些操作仅适用于 company1,有些则不然。
所以我在想这种用法......
[DisableAccess(BlockUsersWhere = u => u.Company != "Acme")]
public ActionResult AcmeOnlyAction()
{
...
}
[DisableAccess(BlockUsersWhere = u => u.IsEmployee == false)]
public ActionResult EmployeeOnlyAction()
{
...
}
对我来说看起来很干净并且确实很容易实现,但是我收到以下编译器错误:
“BlockUsersWhere”不是有效的命名属性参数,因为它不是有效的属性参数类型
显然你不能使用 Func 作为属性参数。还有其他建议来解决这个问题,或者提供我们在 MVC 项目中喜欢的简单用法的其他建议吗?
Necros 的建议可行,但你必须援引他的建议SecurityGuard
助手体内的每一个动作方法。
如果您仍然想使用基于声明性属性的方法(其优点是您可以将属性应用于整个控制器),您可以编写自己的方法授权属性 http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
public class CustomAuthorizeAttribute : AuthorizeAttribute {
public bool EmployeeOnly { get; set; }
private string _company;
public string Company {
get { return _company; }
set { _company = value; }
}
protected override bool AuthorizeCore(HttpContextBase httpContext) {
return base.AuthorizeCore(httpContext) && MyAuthorizationCheck(httpContext);
}
private bool MyAuthorizationCheck(HttpContextBase httpContext) {
IPrincipal user = httpContext.User;
if (EmployeeOnly && !VerifyUserIsEmployee(user)) {
return false;
}
if (!String.IsNullOrEmpty(Company) && !VerifyUserIsInCompany(user)) {
return false;
}
return true;
}
private bool VerifyUserIsInCompany(IPrincipal user) {
// your check here
}
private bool VerifyUserIsEmployee(IPrincipal user) {
// your check here
}
}
然后你可以按如下方式使用它
[CustomAuthorize(Company = "Acme")]
public ActionResult AcmeOnlyAction()
{
...
}
[CustomAuthorize(EmployeeOnly = true)]
public ActionResult EmployeeOnlyAction()
{
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)