ASP .NET中没有表单身份验证的基于角色的安全性

时间:2012-06-12 09:56:04

标签: asp.net forms-authentication iprincipal iidentity

我想利用:

        Page.User.IsInRole("CustomRole");
        Page.User.Identity.IsAuthenticated

在Page方法中工作时,以及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);

但我没有使用FormsAuthentication。

由于

2 个答案:

答案 0 :(得分:0)

简而言之,您必须实现自己的身份验证模块。

身份验证模块只是一个ASP.NET模块,但具有特殊用途。其AuthenticateRequest方法应使用HttpContext.Current.User的实例填充IPrincipal属性。

回答您的其他问题:IPrincipal只是一个界面,GenericPrincipal是其实现之一。您可以使用它,顾名思义它只是一个通用的实现,这意味着它应该适合您。由于IPrincipal只是IIdentity加上角色,您可能还需要GenericIdentity

其他实现(如RolePrincipal + FormsIdentity)是为特定目的而设计的,例如,这两个实现由表单身份验证模块使用。

有一些很好的例子,只需谷歌“自定义身份验证模块”。

答案 1 :(得分:0)

在您(创建/实现自己的)之前,您是否尝试/考虑过将表单身份验证调整为现有的身份验证方案?

我认为你“几乎就在那里”(使用所有内置的ASP.net auth / membership / profiles / roles),可能更容易/更简单地“插入” “您现有的身份验证方案已进入表单身份验证。

snippet of code应该可以让您了解表单身份验证的灵活性:

if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps"))
{
      FormsAuthentication.RedirectFromLoginPage 
         (UserEmail.Text, Persist.Checked);
}
else
{ ... }

因此,它适用于硬编码的“身份验证方案”(不是你应该,但是让你了解可能性),甚至是列表in 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>

只是一个想法 - 他......