我想利用:
Page.User.IsInRole("CustomRole");
Page.User.Identity.IsAuthenticated
在页面方法以及 web.config 中的授权部分工作时:
<authorization>
<allow roles="Administrators, Supervisors" />
<deny users="*" />
</authorization>
并在类和方法级别应用规则:
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
在我的应用程序中,我使用 ...在...HTTP 标头。我获得用户 PIN 码(某种 ID)+ 角色。但这是一个支线情节。这不重要。
我真正想要实现的是利用授权功能中的 ASP .NET 构建,但具有我的自定义身份验证机制。我想我必须实现 IPrincipal 和 IIdentity,对吗?我在网络上看到了很多示例,但所有这些示例都包括指定提供程序的 web.config 配置,以及类似类的 FormsAuthentication,我想我不需要。我只需要将我的用户对象(由我准备)注入请求中,仅此而已。
所以:
- 实现它的最简单方法是什么?
- GenericPrincipal/IPrincipal有什么区别?
如何获取/创建 IIdentity 对象?我看到了以下样品:
var id = new FormsIdentity(authTicket);
但我没有使用表单身份验证。
谢谢
简而言之,您必须实现自己的身份验证模块。
身份验证模块只是一个 ASP.NET 模块,但具有特殊用途。它的AuthenticateRequest
方法应该用 IPrincipal
的实例填充HttpContext.Current.User
属性。
回答您的其他问题:IPrincipal
只是一个接口,而GenericPrincipal
是其实现之一。你可以使用它,顾名思义,它只是一个通用的实现,这意味着它应该适合你。由于IPrincipal
只是IIdentity
加角色,因此您可能还需要GenericIdentity
。
其他实现(如 RolePrincipal
+ FormsIdentity
)是为特定目的而设计的,例如,这两个由表单身份验证模块使用。
有一些很好的例子可用,只是谷歌的"自定义身份验证模块"。
在执行(创建/实现自己的身份验证)之前,您是否尝试/考虑过使表单身份验证适应现有的身份验证方案?
我认为您"几乎在那里"(使用所有内置 ASP.net 身份验证/成员资格/配置文件/角色),并且将现有的身份验证方案"插入"到表单身份验证中可能更容易/更简单。
此代码片段应让您了解表单身份验证的灵活性:
if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps"))
{
FormsAuthentication.RedirectFromLoginPage
(UserEmail.Text, Persist.Checked);
}
else
{ ... }
因此,它与硬编码的"身份验证方案"(不是您应该使用,而是让您了解可能性)甚至 web.config 中的列表一起使用 - 同样,只是一个示例:
<authentication mode="Forms">
<forms name=".FUBAR">
<credentials passwordFormat="MD5">
<user name="foo" password="b7ab5072e8fba7bed20384cc42e96193"/>
<user name="bar" password="1c42e49a360aa7cc337a268a1446a062"/>
<user name="john" password="5f4dcc3b5aa765d61d8327deb882cf99"/>
<user name="jane" password="7c6a180b36896a0a8c02787eeafb0e4c"/>
</credentials>
</forms>
</authentication>
只是一个想法 - 嗯....