我有一个CustomAuthorize
属性,用于检查用户是否可以访问功能(用户或角色可以与一组分层函数中的项目相关联)。
对于给定的行动方法......
[CustomAuthorize("Security.Admin.ManageWidgets.Update")]
这有效,但我担心安全对象的更改可能会导致在运行时才会检测到的问题。我意识到我可以编写单元测试来缓解这种风险,但我想知道是否可以在编译时检查属性参数。我也喜欢Intellisense帮我输入这个表达式。
理想情况下,我可以传递一个lambda表达式。
[CustomAuthorize(i => i.Admin.ManageWidgets.Update)]
不幸的是is not currently possible(additional info from Microsoft)。
我也尝试封装表达式,希望它被评估,然后作为字符串传递给属性,但是也无法使用相同的错误进行编译( Expression不能包含匿名方法或lambda表达式 )。
[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))]
如何为自定义属性参数添加一些设计时/构建时支持?
答案 0 :(得分:3)
带有常量的静态类。
public static class Rights
{
public const string UpdateWidgets = "UpdateWidgets";
}
还包括用它们装饰的方法的单元测试,你会很好。
[CustomAuthorize(Rights.UpdateWidgets)]
答案 1 :(得分:1)
不,你不能在编译时检查这些类型的东西 - 你可能希望的最好的是一个构建后的步骤,通过反射检查这一点。
您可以改为提供类型和方法名称,如下所示:
[CustomAuthorize(typeof(Security.Admin.ManageWidgets), "Update")]
但是看到你仍然需要输入方法的名称,这是有争议的,这真正让你获益。
答案 2 :(得分:1)
您可以使用T4 templates创建包含字符串属性的自定义类,最后使用类似于BennyM的代码,但会自动生成。