惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

博客园 - G yc {Son of VB.NET}

解决安装Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0 错误 25541 解决“计划任务不存在的问题”方法 开启 Win 2008 R2 可靠性历史记录 解决 Hyper-V R2 虚拟网卡影响网速变慢问题 Win7/R2 原生VHD 启动 沈阳 .NET 俱乐部 10月25日 Windows 7社区发布活动 俱乐部活动讲师 & 场地招募中。。 WCF 部署问题 小总结 (HTTP 不能注册的解决方法 和 部署Bat脚本) Win7 支付宝证书 安装记 (翻译)《介绍 GENEVA Beta 1 白皮书》(3) (翻译)《介绍 GENEVA Beta 1 白皮书》(2) (翻译)《介绍 GENEVA Beta 1 白皮书》(1) 翻译预告 《介绍 GENEVA Beta 1 白皮书》 安全探索——.NET 3.0 中的标识模型(1) 安全探索——.NET 中的角色安全(4) 安全探索——.NET 中的角色安全(3) 安全探索——.NET 中的角色安全(1) 发布 事例 Comics Service [转载] 让VS2010 CTP 运行在Hyper-V 上
安全探索——.NET 中的角色安全(2)
G yc {Son of VB.NET} · 2009-02-19 · via 博客园 - G yc {Son of VB.NET}

(写在之前,恩上次写的东西也不算是太多哦~不过上周网络突然故障,写完后一直没有发出)

在上一篇文章中,我说了一下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")
Dim MyIdentity As New GenericIdentity("MyUser""User")

  提示:建立标识对象不能指定是否通过验证, 所以,如果用户名不是空字符串(“”) ,就是通过验证。

2、创建 GenericPrincipal 类的一个新实例,并用先前创建的 GenericIdentity 对象和表示希望与此主体关联的角色的字符串数组对其进行初始化。下面的代码示例指定表示一个管理员角色和一个用户角色的字符串数组。然后用前面的 GenericIdentity 和该字符串数组对 GenericPrincipal 进行初始化。

Dim MyStringArray As String() = {"Manager""Teller"
DIm MyPrincipal As New GenericPrincipal(MyIdentity, MyStringArray)

实际上,关于这2个没有多少可以说的。想到后期,可能没有提及的地方的, 所以索性放到这里。

clip_image001clip_image002

clip_image003clip_image004

不知道有没有人注意到,Thread.CurrentPrincipal 实际上是可写。 因此,可以

替换 Principal 对象

替换Principal 对象,实际上并不难,关键语句只有一个:

1、创建替换的 Principal 对象和关联的 Identity 对象(通常在执行身份验证后进行)。

2、将新的 Principal 对象附加到调用上下文中,如以下代码所示。

Thread.CurrentPrincipal = principalObject

到此可以知道.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的名字和登录路径。

<authentication mode="Forms">
    
<forms name=".Demo" loginUrl="Logon.aspx"/>
</authentication>

2、继续修改Web.config 的membership,profile,roleManager 节点,设置必要的Provider。

<membership>
    
<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、设置数据库的连接字符串

<connectionStrings>
       
<clear/>
       
<add name="LocalSqlServer" connectionString="data source=.;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>

经过以上几个步骤,基本开启Forms认证了。设下的就是在网页上使用了。

clip_image005clip_image006