安全探索——.NET 中的角色安全(2)
2009-02-19 22:23 G yc {Son of VB.NET} 阅读(360) 评论(0) 编辑 收藏 举报(写在之前,恩上次写的东西也不算是太多哦~不过上周网络突然故障,写完后一直没有发出)
在上一篇文章中,我说了一下WindowsIdentity 和Windows Principal。不过上回没有说一下Windows适用到什么地方,这里简单说一下,比较适合 域 环境的用户,对于其他的就是很合适了。还有一个是本机,不过这个意义不是很大(对用户而言),应该主要是对服务可能能比较有用。
恩, 说完这个,上回的程序,还有一个地方没有说的。
就是 程序本身 支持一个 “-noinit”参数,起结果就是,不去初始化WIndows凭据。所以界面基本空白。
这里再说一点, Windows 程序 默认会初始化使用Windows 凭据, 但WPF 却不是。
所以当使用了“-Noinit” 参数 启动程序,就不是Windows凭据对象了,而是 GenericPrincipal 对象。
GenericPrincipal 和 GenericIdentity 对象
这2个对象是用来表示一般凭据对象, 也是最简单的一个。它的出现,主要是没有对应专有类型。
关于这2个类的详细信息可以看这里 GenericIdentity 类 和 GenericPrincipal 类 。
创建 GenericPrincipal 和 GenericIdentity 对象
1、创建标识类的一个新实例,并用希望它持有的名称对其进行初始化。以下代码创建一个新的 GenericIdentity 对象,并用名称 MyUser 对其进行初始化。实际上,还有一个重载方法,用来指定验证类型。
Dim MyIdentity As New GenericIdentity("MyUser","User")
提示:建立标识对象不能指定是否通过验证, 所以,如果用户名不是空字符串(“”) ,就是通过验证。
2、创建 GenericPrincipal 类的一个新实例,并用先前创建的 GenericIdentity 对象和表示希望与此主体关联的角色的字符串数组对其进行初始化。下面的代码示例指定表示一个管理员角色和一个用户角色的字符串数组。然后用前面的 GenericIdentity 和该字符串数组对 GenericPrincipal 进行初始化。
DIm MyPrincipal As New GenericPrincipal(MyIdentity, MyStringArray)
实际上,关于这2个没有多少可以说的。想到后期,可能没有提及的地方的, 所以索性放到这里。
不知道有没有人注意到,Thread.CurrentPrincipal 实际上是可写。 因此,可以
替换 Principal 对象
替换Principal 对象,实际上并不难,关键语句只有一个:
1、创建替换的 Principal 对象和关联的 Identity 对象(通常在执行身份验证后进行)。
2、将新的 Principal 对象附加到调用上下文中,如以下代码所示。
到此可以知道.NET Framework 2.0 主要是用当前的Principal来验证用户身份。因此可以使用一个提供身份验证服务来更换线程的 Principal 对象。当然,这也会引入安全问题。
提示:替换Principal的时候,需要 System.Security.Permissions.SecurityPermission权限。
FormsIdentity 和 RolePrincipal 对象
终于进入下一个主要的部分了,说道ASP.NET 2.0 中新增功能,自然要提及自带的Membership。 其Forms认证模式,就使用FormsIdentity 和 RolePrincipal 对象。
先说一个题外话,ASP.NET 默认是 Windows 认证, 也就是 WindowsIdentity。所以,需要先修改成Forms认证才可以。另外,在说一点是 如果没有登录,那么Identity是GenericIdentity 对象,而Principal则始终是RolePrincipal 对象。
关于这2个类的详细信息,可以查看这里 FormsIdentity 类 和 RolePrincipal 类。
使用Forms认证和开启 Role 功能的步骤:
1、修改 Web.config 的 authentication 节,将认证模式改成“Forms”,并指定Cookie的名字和登录路径。
<forms name=".Demo" loginUrl="Logon.aspx"/>
</authentication>
2、继续修改Web.config 的membership,profile,roleManager 节点,设置必要的Provider。
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="DemoIdentity"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="DemoIdentity"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>
<roleManager enabled="true">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="DemoIdentity"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
3、设置数据库的连接字符串
<clear/>
<add name="LocalSqlServer" connectionString="data source=.;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
经过以上几个步骤,基本开启Forms认证了。设下的就是在网页上使用了。