您好我想将安全属性放在常规实例方法上。这是一个例子:
[EnsureUserIsAdmin] //I want something like this
public IEnumerable<NameItem> GetNameItems(int Id)
{
return _nameDataController.GetNameItems(Id);
}
此方法属于我的业务逻辑。使用此方法的任何其他代码都必须通过检查以查看用户是否为管理员。如果可以这样做,我将如何进行单元测试?
答案 0 :(得分:1)
假设您要问的是您是否可以使用属性以自动方式任意限制对方法的访问,那么如果您的应用程序的安全主体对象是Windows主体(例如,您正在使用Active Directory或Windows身份验证),是的,您可以使用PrincipalPermission Attribute。
[PrincipalPermission(SecurityAction.Demand, Role = "MyAdminRole")]
public void TestMethod()
{
}
答案 1 :(得分:0)
过滤器属性与普通属性不同,驻留在Controller Actions
上,是ASP.NET控制器执行过程的一部分,由路由引擎收集和执行。
解决方案不是开箱即用的,并且需要相当多的非常重要的复杂性。 在非动作方法的情况下,您可以选择创建自己的受控环境,这将受到限制并且有点被迫。
我会反对它并使用常规方法前置条件或在目标方法中调用另一个验证方法来测试“安全性”或其他验证,但肯定不是属性。
如果您仍想使用属性,则以下内容可以作为解决方案。
你需要制作某种CustomSecurityManager
来执行你想要的目标方法,他将负责:
注意:只有CustomSecurityManager正在调用GetNameItems
。
可以通过注入ICustomSecurityManager来实现单元测试,该模型将被模拟以返回预期结果。