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

推荐订阅源

量子位
Recorded Future
Recorded Future
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Scott Helme
Scott Helme
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
Project Zero
Project Zero
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
S
Schneier on Security
S
SegmentFault 最新的问题
G
GRAHAM CLULEY
J
Java Code Geeks
IT之家
IT之家
爱范儿
爱范儿
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志
P
Palo Alto Networks Blog
Jina AI
Jina AI
腾讯CDC
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
T
Threatpost
V
V2EX
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
美团技术团队
小众软件
小众软件
NISL@THU
NISL@THU
Simon Willison's Weblog
Simon Willison's Weblog
T
The Exploit Database - CXSecurity.com
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Securelist
V
Vulnerabilities – Threatpost
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
A
Arctic Wolf
U
Unit 42
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org

博客园 - Flier Lu

[草稿] 自动下载完整的.NET源代码 Atlas 实现机制浅析 [3] Atlas 实现机制浅析 [2] Atlas 实现机制浅析 [1] [草稿] Managed COM Apartment - ExecutionContext [1] ASP.NET 2.0 异步页面原理浅析 [1] 也评《应用框架的设计与实现——.NET平台》 CLR 调试支持机制原理浅析 [1] 整体结构 [草稿] 咬文嚼字之 Java 版 关注企业级服务自身的可管理性 享受 .NET 时代的 COM+ 开发 感受 COM+ 事务性 在 CLR 1.1 中获取 IL 函数体信息 GDS [1] 使用Google桌面搜索构建企业搜索方案 基于透明代理的内部类访问抽象 [2] 自动类型转换与封装 基于透明代理的内部类访问抽象 [1] 类型与调用的封装 使用 FishEye 直观了解 CVS 情况 在 .NET 中获取 AD 上帐号密码过期时间 用WinDbg探索CLR世界 [10] 透明代理实现原理浅析 - 静态结构
[TIPS] 正确判断当前用户角色
Flier Lu · 2004-12-01 · via 博客园 - Flier Lu

原文:http://www.blogcn.com/User8/flier_lu/blog/5043440.html

    在使用 Forms 模式认证的基于角色的 ASP.NET 系统里面,可以通过 HttpContext.Current.User 属性,来判断当前用户的角色,这里的角色只是在配置文件中定义的一个字符串形式名称而已。

    但对于 Windows 模式认证的情况,要通过 HttpContext.Current.User 或 Thread.CurrentPrincipal 判断用户角色,就必须考虑到角色命名格式的问题。因为在 Windows 模式认证的情况下,IPrincipal 接口的实现是由 WindowsPrincipal 类型完成的,其角色名称是直接通过 WindowsIdentity 类型的内部方法,从操作系统或 AD 获取并命名的。

    按 MSDN 里的说法,这里的角色命名方法包括内建角色的 "BUILTIN" 前缀、本机角色的 "MACHINENAME" 前缀和 "DOMAINNAME" 前缀,而且对 FX 1.0 版本还有大小写的限制。

  For built-in roles, the role string should be in the form "BUILTIN\RoleNameHere". For example, to test for membership in the Windows administrator role, the string representing the role should be "BUILTIN\Administrators". Note that the backslash might need to be escaped.

    For machine- or domain-specific roles, the role string should be in the form "MACHINENAME\RoleNameHere" and "DOMAINNAME\RoleNameHere".

    Note In .NET Framework version 1.0 the role parameter is case-sensitive. In .NET Framework version 1.1 and later the role parameter is case-insensitive.

    Tip When testing for newly created role information, such as a new user or a new group, it is important to log out and log in to force the propagation of role information within the domain. Not doing so can cause the IsInRole test to return false.

    选择在什么时候使用什么样的名称,这时就会变成一件头痛的事情,可能需要多次反复的尝试 :S

    好在通过对其实现方法的分析,我们可以获得一个非常简便的了解命名规则的方法,并能够编写一些辅助函数来判断命名的有效性。要了解此方法,我们先来看看 WindowsPrincipal 对象的实现:

    .NET Framework v1.1 在实现上 WindowsPrincipal 对象只是一个角色名称的缓存而已。它保留构造时传入的 WindowsIdentity 对象引用,在需要判断角色时,动态获取其角色列表并缓存在本地。其核心函数 IPrincipal.IsInRole 的实现伪代码如下:

    为了线程安全和查找效率,真实实现里还使用了诸如 double-check 模式避免线程死锁,并在角色过多(24个以上)时使用 Hashtable 优化查询性能等等。

    不过对我们来说,这已经足够了。我们可以通过直接调用 WindowsIdentity.GetRoles 方法,获得当前帐号所在的所有角色列表(也就是 Windows 下的组),了解其命名方法或给出调试日志信息。例如:

    采用类似的原理,我们还可以直接访问保存 Forms 认证模式的角色列表的 GenericPrincipal 对象的 m_roles 字段,获得当前 Forms 认证用户的角色列表。

    而在 .NET Framework v2.0 中,则引入了安全描述符 SecurityIdentifier 类型的定义。由 WindowsPrincipal.IsInRole 方法把角色名称,通过 NTAccount.Translate 从 NTAccount 类型帐号转换为对应的 SecurityIdentifier 类型安全描述符。

    而对用户是否属于某个角色的判断,也由简单的字符串搜索,改为调用系统 CheckTokenMembership 函数完成。因此如果需要获取 Windows 用户所在组列表,就必须通过正规的 Windows 安全相关函数完成。有兴趣的朋友可以参考《Programming WINDOWS Security》一书相关章节。不过 Forms 认证模式的角色列表获取方法仍然有效。