在查看表单授权/身份验证时,我发现可以通过向FormsAuthenticationTicket添加一组角色来进行基于角色的授权。那样我就可以写了
User.IsInRole(role from database)
但有没有办法对像以下角色的权限做同样的事情:
if (User.IsInRole(role from database)) {
if (User.CanRead()) {
//--- Let the user read
}
if (User.CanWrite()) {
//--- Let the user write
}
}
我已阅读了几篇文章和论坛帖子,其中将权限添加到数组而不是角色,从而导致使用
User.IsInRole(permission from database)
然而,这不是一回事。希望有人可以就此问题提供一些意见,抛出链接到文章或更好的代码示例。
答案 0 :(得分:4)
你最好改变你对角色的看法。如果有帮助,请使用术语“权限”或“声明”。然后创建所需的所有角色,并将给定用户链接到所有必要的角色。
一个用户可以属于多个角色。通过这种方式,以下简单代码可以正常工作,您无需构建自己独特的工作方式。
if(User.IsInRole(someRole) && User.IsInRole(someOtherRole))
{
// do something
}
你可以制作一些C#扩展方法,使其更具可读性:
if(User.IsInSomeRoleAndOtherRole())
{
// do something
}
扩展方法可能如下所示。使用以下代码创建一个新类,然后在代码中包含类命名空间,并且可以使用如上所示的扩展方法。
using System.Security.Principal;
namespace MyCompany
{
public static class MyExtensions
{
public static bool IsInSomeRoleAndOtherRole(this IPrincipal principal)
{
if (!principal.IsInRole("someRole"))
return false;
if (!principal.IsInRole("someOtherRole"))
return false;
return true; // the user meets the requirements
}
}
}