我正在努力构建一个自定义会员提供程序,让我拥有我需要的安全方案。
我有自己的 IPrincipal、IIdentity 和 MembershipProvider。我的身份验证工作正常。我现在遇到的问题是授权。
我对授权方案的问题在于 IPrincipal 的 IsInRole 行为。这种行为与 ASP.NET Webforms 的各种功能紧密耦合,我主要关心的是站点地图授权,因为如果可以的话,我想使用它。
因此,您可能传统上拥有这样的站点地图:
<siteMap xmlns="blahblah">
<siteMapNode url="PersonView.aspx"
title="View Person"
description="View the details of a person"
roles="ViewerRole" />
</siteMap>
在这里,任何试图访问 PersonView.aspx 页面的人都需要拥有 ViewerRole。这就是我的问题出现的地方。我不想让我的授权与用户的角色相关联。相反,我希望授权与我正在执行的行为相关联,并让幕后的一些底层事物负责授权。
所以我真正想要的是这样的东西:
<siteMap xmlns="blahblah">
<siteMapNode url="PersonView.aspx"
title="View Person"
description="View the details of a person"
roles="Person|View" />
</siteMap>
这应该被解释为任何试图访问 PersonView.aspx 页面的人都必须拥有对Person业务对象的查看权限。
我已经有一个 Authorizer 对象,其签名如下:
public static bool Authorize(Type type, Access access, IUser user)
例如,这将采用 Person 类型、View 访问权限(枚举)以及要检查的用户。现在,我已经弄清楚了 Authorize 中的代码。
我的问题是,我如何从 IPrincipal 的 IsInRole 到我的 Authorize?我尝试了不同的东西,但它们似乎都不起作用。我真的不喜欢魔术字符串的方法,但似乎我坚持下去了。如果有办法以强类型的方式构建它,我肯定会更喜欢它。有没有更好的方法来做到这一点,我没有想到?