ASP .NET 中没有表单身份验证的基于角色的安全性
Posted
技术标签:
【中文标题】ASP .NET 中没有表单身份验证的基于角色的安全性【英文标题】:Role-based Security without Forms Authentication in ASP .NET 【发布时间】:2012-06-15 04:38:49 【问题描述】:我想利用:
Page.User.IsInRole("CustomRole");
Page.User.Identity.IsAuthenticated
在 Page 方法以及 web.config 中的 authorization 部分中工作时:
<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。
谢谢
【问题讨论】:
【参考方案1】:简而言之,你必须实现自己的身份验证模块。
身份验证模块只是一个 ASP.NET 模块,但具有特殊用途。它的AuthenticateRequest
方法应该使用IPrincipal
的实例填充HttpContext.Current.User
属性。
回答您的其他问题:IPrincipal
只是一个接口,而GenericPrincipal
是它的实现之一。您可以使用它,顾名思义,它只是一个通用实现,这意味着它应该适合您。由于IPrincipal
只是IIdentity
加上角色,您可能还需要GenericIdentity
。
其他实现,如RolePrincipal
+ FormsIdentity
是为特定目的而设计的,例如这两个由表单身份验证模块使用。
有一些很好的例子,只是谷歌“自定义身份验证模块”。
【讨论】:
谢谢!但是在使用表单身份验证时是否可以注入您自己的 IPrinciple?我尝试使用自定义身份验证,但我无法访问会话(我想将我的用户对象存储在那里,稍后将注入到 HttpContext.Current.User 中),这对我来说是个问题。 您可以将您的身份验证对象临时存储在Items
容器中,然后在会话可用时将其复制到会话容器(AcquireRequestState
事件)。【参考方案2】:
在您这样做(创建/实施您自己的)之前,您是否尝试/考虑过将表单身份验证适应您现有的身份验证方案?
我认为您“差不多”(使用所有内置的 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>
只是一个想法-hth....
【讨论】:
一切都很好,但我需要将我自己的 IPrinciple 实现存储在 HttpContext.Current.User 中。而且我不知道Forms Auth是否可行。谢谢!以上是关于ASP .NET 中没有表单身份验证的基于角色的安全性的主要内容,如果未能解决你的问题,请参考以下文章
根据 ASP.NET 中的角色设置身份验证 cookie 超时长度
ASP.NET MVC 表单身份验证 + 授权属性 + 简单角色
如何在 Python 中使用 JWT 实现基于角色的身份验证
SQL 数据库驱动的 C# 和 ASP.Net 基于角色的身份验证控制