WIF基本原理(2)基于声明的标识模型

WIF基本原理(2)基于声明的标识模型

基于声明标识模型,简单来讲,就是将用户信息作为声明条件,向应用程序来提供用户标识。一个声明以是用户名,也可能是电子邮件地址。现在想法是配置外部标识系统,为应用程序提供解用户及其所做各个请求所需所有信息,以及从可靠源接收标识数据加密保证。

基于声明标识模型,更容易实现单点登录,并且应用程序可以彻底摆脱以操作:

1)        对用户进行身份验证。

2)        存储用户账户和密码。

3)        调用企业目录以查看用户标识详细信息。

4)        从其平台或公司与标识系统集成。

在基于声明标识模型中,应用程序将根据用户所提供声明来做出与标识相关决策。这可以是任何内容,从包含用户名字简单应用程序个性化设置,到授予用户访问应用程序中高级功能和资源权限。

基本概念

面简单介绍基于声明标识模型基本术语。

(1)      标识

“标识”一词通常是一个不明确术语。但为描述WIF编程模型,这里使用术语标识来描述一组说明要保护系统中用户或其一些实体特性。比如一个常见互联网站点,对于一个普通用户,标识可能是用户名,可能是性别,也可能是爱好,总之是一个完整实体特性。

(2)      声明

将声明视为一条标识信息,如销售角色中姓名、电子邮件地址、年龄、成员身份。应用程序接收声明越多,对用户解得就越多。可能想知道为何将这些称为声明而不是通常描述企业目录时用到特性。原因就在于送达方式。在此模型中,应用程序并不在目录中查询用户特性。相反,用户向应用程序传达声明,由应用程序对其进行检查。各声明均由颁发者发出,对这些声明信任度与对颁发者信任度一样。例如,对公司域控制器发出声明信任度高于对用户自己发出声明。WIF代表Claim类型声明,此类型声明具有找出声明颁发者Issuer属性。

(3)      安全令牌

用户向应用程序传递一组声明和一个请求。 Web服务中,这些声明将在 SOAP封装安全标头中传递。在基于浏览器Web应用程序中,这些声明将通过HTTP POST从用户浏览器中到达,并可能随后缓存在 Cookie中(如果需要会话)。不论这些声明如何到达,都必须对其进行序列化,这也是安全令牌所在之处。安全令牌是一组经过颁发机构数字签名序列化声明。此签名非常重要:它向保证用户并不只是生成大量声明然后发送给。在没必要或不希望加密安全性较低情况,可使用未签名令牌。

WIF一个核心功能是,可以创建和读取安全令牌WIF.NET Framework可以处理所有加密工作,并为应用程序提供一组可以读取声明。

(4)      颁发机构

不同类型颁发机构有很多,从颁发 Kerberos票证域控制器到颁发X.509证书证书颁发机构。这里讨论颁发机构是可颁发包含声明安全令牌机构。此颁发机构是解如何颁发安全令牌 Web应用程序或 Web服务。它必须发出正确声明,提供给目标信赖方和提出请求用户,并且负责查看声明并对用户本身进行身份验证。

不论选择哪个颁发机构,它在标识解决方案中作用都十分重要。在通过信任声明将身份验证因素从应用程序中排除时,会将责任转交给该机构并要求其以名义对用户进行身份验证。

(5)      标准

为使所有这些操作能够交互,使用多个WS-*标准。使用WS-MetadataExchange检索策略,并根据WS-Policy规范对策略本身进行结构化。STS安全令牌服务)公开实施WS-Trust规范终结点,此规范描述如何请求和接收安全令牌。如今,大多数 STS可颁发安全声明标记语言(SAML)格式令牌。SAML是行业认可XML词汇,可用于以交互方式表示声明。或者,在多平台情况,这使可以与完全不同平台上 STS进行通信,并在所有应用程序中实现单点登录。

(6)      基于浏览器的应用程序

基于浏览器应用程序也可以使用标识模型。

首先,用户将浏览器指向Web应用程序(信赖方应用程序)。Web应用程序将此浏览器重定向到STS以便可以对用户进行身份验证。在可以读取传入请求简单 Web应用程序中托管 STS,使用标准HTTP机制对用户进行身份验证,然后创建SAML令牌并通过一段JavaScript代码给予回复,此代码将使浏览器发起可将SAML令牌发送回RPHTTP POST POST正文包含RP请求声明。此时,RP通常会将声明打包到Cookie以便不必为各个请求重定向用户。

(7)      CardSpace和标识选择器

WIFCardSpace序列化提供API,此API可用于构建托管信息卡颁发以及在应用程序中启用信息卡登录。

标识选择器提供以功能:

q  帮助用户管理 Web多个标识。

q  帮助用户为指定信赖方选择适当标识。

q  帮助保护用户隐私。

基本实现

在具体解基于声明标识模型实现机制之前,先来解或者说回顾传统验证模式。当然,本书高级扩展部分会推荐基于声明标识模型,不代表传统方式做不好,事实上,实践验证它们足够优秀。讨论基于声明标识模型,给一个全新选择,或者在适合场景使用它。

(1)       Iprincipal接口

管理标识和访问控制,需要得到当前应用环境用户信息,从而根据用户信息识别其标识,并根据标识来判断权限。

.NET应用程序中,当前上文中用户信息由IIdentity接口来表示。该接口定义如代码清单15-1所示。

代码清单15-1  IIdentity接口定义

   public interface IIdentity

    {

        // Properties

        string AuthenticationType { get; }

        bool IsAuthenticated { get; }

        string Name { get; }

    }

IIdentity接口主要作用是用来验证,这一点从它属性中也能看出来。提到验证肯定会想到授权。

(2)       Iidentity接口

在授权环节用到最主要接口是Iprinicipal,定义如代码清单15-2

代码清单15-2  Iprinicipal定义

    public interface IPrinicipal

    {

        // Methods

        bool IsInRole(string role);

        // Properties

        IIdentity Identity { get; }

    }

Iprinicipal接口中,用来做授权验证前提是它Identity属性。在.NET程序中,总能从上文中获取Iprinicipal示例,比如在ASP.NET程序中,可以通过HttpContext.Current.User属性获取该值,在一般程序中可以通过Thread.CurrentPrincipal来获取该实例。本书前面章节介绍过.NETIprinicipal不同实现,比如WindowsPrincipalGenericPrincipal或者自定义的实现。当然,这只是传统.NET认证和授权内容冰山一角,不过本书中已经用足够篇幅来讨论它们,而且也是目前.NET安全框架核心。

当使用VS创建一个ASP.NETWeb站点,默认验证模式是Windows,这意味着,应用程序期望IIS来负责验证用户。然而,当检查此应用场景Iprinicipal会发现,大部分属性都是空值,这是因为默认情况Web站点启用匿名验证。此时需要使用IIS或者修改Web.config来禁用匿名访问,启用Windows验证。

当调整完之后,应该知道,这样验证方式只适合当前局域网络,如果换个环境将无法访问。如果在代码中使用IsInRole类似方法来做角色判断,那么当站点进行迁移之后,将完全失效。比如换服务器,业务转移到云中。

面对互联网环境,或者为使应用更具灵活性,选择Form身份验证方式,不可避免需要构建数据库来存储用户信息。Form身份验证方式带来很大灵活性,但是仍然无法兼容异构系统统一验证,甚至在一个WCFASP.NET互相协助系统中,也无法统一Form认证和WCF身份认证。

将身份验证交给Windows或者交给ASP.NET,都是不错做法,因为在一定程度上将这样工作交给“第三方”。但是仍然无法真正从设计角度将用户标识和访问限制同业务应用分离出来。

(3)       分离应用和标识验证

曾几何时,开发人员被迫在程序中直接处理硬件。如果想打印文档,需要知道如何在程序中调用打印模块,使用各种中断,而且硬件不同,调用方式也会不同。

幸运是,那些日子已经一去不复返。今天,们可以间接调度硬件通过驱动程序。所有驱动程序都公开简单调用接口给上层应用程序,们将接口层称作逻辑层,它面是核心驱动,核心驱动面才是硬件层。

现在,作为.NET开发人员,只需要调用一个PrintDocument方法就可以解决问题。

直接在程序中处理认证和授权与直接在程序中处理打印模块相比,二者很相似:需要处理太多复杂情况,要应对各种各样变化。硬件调用问题被驱动程序解决,那么是否有理由相信,可以用类似方法来解决访问控制问题呢?

标识和访问控制统一面临着巨大挑战,比如,目前验证和授权技术和协议属于不同厂商;不同架构,不同业务使用数据存储格式不同;验证点也各不相同。不过也不用太悲观,在Web 2.0时代,为不同应用交换,甚至在安全领域,出现很多标准化协议,比如SOAPWS-SecurityWS-Trust WS-FederationSAMLSecurity Assertion Markup Language),以及最近出现OpenIDOAuth和其开发协议。如果没听说过这些协议,或者不理解其细节也没关系,暂时将注意力集中在这些开放协议给们带来什么。这里不打算去探讨每个协议功能和细节,们从具体场景中来认识基于协议安全框架带来好处。

15-2是一个简单验证系统,它包含基于声明标识模型中几个主要实体。

15-2  基于声明标识模型实体

在这个简单系统中,包括一个用户和一个用户要访问应用。对于应用而言,它也许不需要关心这个用户每一个属性,用户在正式访问应用之前,要经过一个用户到标识转化过程。在本应用场景中将用户虚拟为一个影迷。

应用程序可能是一个网站,可能是一个Web服务,也可能是一个桌面应用,总之,它需要对用户验证和授权。在标识模型中,将这样应用称为信赖方(Relying PartyRP),将应用虚拟为售票员和电影院。

这个系统会包含多个IPIdentity Providers)。每一个IP针对某一类型用户而存在。每一标识提供程序是一个抽象角色,在具体应用时它会被实例化。

假设每一个用户都具有基本信息,用于系统实施验证,这些基本信息就是声明。从另一个角度讲,声明是对在当前上文中对用户一个描述。它是IP创建者,是RP消费者。

15-3该系统验证流程。

15-3  验证流程

现在对图15-3做简要梳理:

1)        用户(Subject)想要访问应用(RP),在本例中假设通过浏览器发送请求。这一步用户被告知需要填写什么信息、RP支持哪一种IP、什么样安全通信协议会被使用。

2)        客户选择一种合适IP,请求令牌。在这个过程中,客户需要提供能被IP识别凭据信息,这些信息被保存在Policy中。

3)        IP接到并开始处理请求。如果IP认为请求合乎规范,它接收声明信息,然后发送一个安全令牌到客户端。

4)        RP接收并检查客户端传递过来安全令牌,如果通过,RP对客户进行授权。

虽然这个简单系统和传统验证模型有很多不同,但是需要从类似或者更复杂场景中抽象出一个简单易用模型。WIF提供这样模型,其他细节可参考《.NET安全揭秘》一书中的相关章节。

-------------------------注:本文部分内容改编自《.NET 安全揭秘》

posted @ 2012-06-24 17:04  玄魂  阅读(1615)  评论(4编辑  收藏  举报