跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

category

本文帮助您作为开发人员学习在零信任应用程序开发中验证应用程序用户的最佳实践。始终使用最小权限和明确验证的零信任原则来增强您的应用程序安全性。

用户身份验证中的ID令牌


当您需要用户对您的应用程序进行身份验证时,您的应用程式可以请求身份(ID)令牌,而不是收集用户名和密码。通过Microsoft身份平台对用户进行身份验证可以避免应用程序保留用户凭据时出现的安全风险。当你请求ID令牌时,如果一个坏人破坏或破坏了你的应用程序,你的应用中就没有用户名和相应的密码。

Microsoft身份平台ID令牌是OpenID Connect(OIDC)标准的一部分,该标准将ID令牌指定为JSON Web令牌(JWT)。JWT长串由三个部分组成:

  • 标题声明。ID令牌中存在的标头声明包括typ(类型声明)、alg(用于签名令牌的算法)和kid(用于验证令牌签名的公钥指纹)。
  • 有效载荷声明。有效载荷或正文(JSON web令牌的中间部分)包含一系列名称属性对。该标准要求有一个带有iss(发行者名称)的声明,该声明指向发行令牌的应用程序(aud或受众声明)。
  • 签名。Microsoft Entra ID生成令牌签名,应用程序可以使用该签名来验证令牌是否未被修改,您可以信任它。
    以下ID令牌示例显示了有关用户的信息,并确认了使用应用程序的身份验证。

JSON

{
 "typ": "JWT",
 "alg": "RS256",
 "kid": "1LTMzakihiRla_8z2BEJVXeWMqo"
}.
{
 "ver": "2.0",
 "iss": "https://login.microsoftonline.com/3338040d-6c67-4c5b-b112-36a304b66dad/…",
 "aud": "6cb04018-a3f5-46a7-b995-940c78f5aef3",
 "exp": 1536361411,
 "iat": 1536274711,
 "nbf": 1536274711,
 "sub": "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ",
 "name": "Abe Lincoln",
 "preferred_username": "AbeLi@microsoft.com",
 "oid": "00000000-0000-0000-66f3-3332eca7ea81",
 "tid": "3338040d-6c67-4c5b-b112-36a304b66dad",
}.
.[Signature]
 

访问管理中的ID令牌


若要接收您的应用程序(客户端)ID,请在Microsoft身份平台上注册您的应用。当您收到一个与您的应用程序的客户端ID匹配的受众声明(aud)的令牌时,令牌中标识的用户将对您的应用进行身份验证。IT管理员可能会允许租户中的所有用户使用您的应用程序。他们可能会允许用户所属的组使用您的应用程序。

如果您收到的令牌的受众声明与您的应用程序的客户端ID不同,请立即拒绝该令牌。用户未通过您的应用程序的身份验证,因为他们已登录到另一个应用程序。始终确保用户有权使用您的应用程序。

这些声明细节在用户身份验证中很重要:

  • JSON web令牌在过期之前一直有效。exp(过期)声明告诉令牌何时过期。如果当前时间早于exp声明中的时间,则令牌有效。
  • 在nbf声明中指定的时间之前(而不是之前),不要认为用户已经过身份验证。令牌的nbf和exp时间定义了令牌的有效生存期。当到期时间即将到来时,请确保您获得了一个新的ID令牌。
  • sub (主题索赔)是应用程序用户的唯一标识符。同一用户对其他应用程序有不同的子索赔。如果要存储数据以关联回用户并防止攻击者进行关联,请使用主题声明。因为它不会暴露用户的Microsoft Entra身份,所以这是将数据与用户关联的最私密的方式。子索赔是不可变的。
  • 如果你想在多个应用程序之间共享信息,请使用用户独有的租户ID(tid)和对象ID(oid)声明的组合。租户ID和对象ID的组合是不可变的。
  • 无论个人的身份发生什么变化,sub、oid和tid声明都是不可变的。关于用户的任何信息都可能发生变化,你仍然可以根据主题或tid和oid的组合声明来识别用户。
     

OIDC身份验证


为了演示用户身份验证,让我们看看使用OIDC对用户进行身份验证的应用程序。同样的原则也适用于使用安全断言标记语言(SAML)或WS-Federation的应用程序。

当应用程序向Microsoft身份平台请求ID令牌时,应用程序会对用户进行身份验证。工作负载(没有用户,而是作为服务、后台进程、守护进程运行的应用程序)跳过此步骤。

你应该先默默地索要这个令牌。要在Microsoft身份验证库中静默获取令牌,您的应用程序可以从AcquireTokenSilent方法开始。如果你的应用程序可以在不干扰用户的情况下进行身份验证,它就会收到请求的ID令牌。

如果Microsoft身份平台在不与用户交互的情况下无法完成请求,那么您的应用程序需要回退到STROAcquireTokenInteractive方法。要交互式获取令牌,请通过打开指向以下地址的web表面来执行请求https://login.microsoftonline.com域

从这个网络界面,用户可以与微软身份平台进行私人对话。您的应用程序无法查看此对话,也无法控制对话。Microsoft身份平台可以要求用户ID和密码、多因素身份验证(MFA)、无密码身份验证或IT管理员或用户配置的其他身份验证交互。

在用户执行所需的身份验证步骤后,您的应用程序将收到一个ID令牌。当您的应用程序收到令牌时,您可以确定Microsoft身份平台对用户进行了身份验证。如果您的应用程序没有收到ID令牌,则Microsoft身份平台没有对用户进行身份验证。不允许未经身份验证的用户继续进入应用程序的安全区域。

应用程序的最佳做法是在用户从Microsoft Entra ID收到ID令牌后为其创建会话。在应用程序收到的ID令牌中,使用Unix时间戳声明过期(exp)。此时间戳指定了应用程序不得接受JWT进行处理的到期时间或之后的时间。使用此令牌过期时间来驱动用户会话的生存期。exp声明在让经过明确验证的用户在应用程序前拥有正确的权限和正确的时间方面起着至关重要的作用。

单点登录支持


单点登录(SSO)身份验证允许用户使用一组凭据登录到多个独立的软件系统。SSO允许应用程序开发人员不需要用户单独和重复登录每个应用程序。在SSO的核心,开发人员确保用户设备上的所有应用程序共享对用户进行身份验证的web表面。成功身份验证后,web表面上的工件(如会话状态和Cookie)会驱动SSO。

如下图所示,共享web表面最简单的用例是在web浏览器(如Microsoft Edge、Google Chrome、Firefox、Safari)中运行的应用程序。浏览器选项卡共享SSO状态。

该图说明了应用程序在浏览器中运行的共享web表面场景。

图表标题:Web浏览器——最简单的情况。出现在图表顶部中心的是一个包含Microsoft Entra ID图标的云形状。云形状下面是一个盒子。连接云形状和盒子的是一条两端都有箭头的线。框标签是“保持我登录,跨调用保存SSO状态cookie”。框内左侧是一个看起来像cookie的图标。cookie下方的标题是“与用户的私人对话”。标题下方是一个代表用户的图标。在这三个组件的左侧,盒子里是另一个盒子。内部框标签是“选项卡”。标签下方是四个方形框,代表选项卡中的浏览器窗口。

Microsoft身份平台管理任何特定浏览器中的SSO状态,除非用户在同一设备上打开了不同的浏览器。在Windows 10及更新版本上,Microsoft身份平台本机支持浏览器SSO Microsoft Edge。当用户登录到Windows时,Google Chrome(通过Windows 10帐户扩展程序)和Mozilla Firefox v91+(通过浏览器设置)中的设置允许每个浏览器共享Windows本身的SSO状态。

如下图所示,本机应用程序用例更复杂。

该图说明了没有SSO的嵌入式浏览器的复杂本机应用程序用例。

图表标题:本机应用程序-嵌入式浏览器-无SSO。出现在图表顶部中心的是一个包含Microsoft Entra ID图标的云形状。图的底部是四个水平排列的方框。每个框的右下角都有一个代表用户的图标。每个框内都有一个浏览器窗口的表示,包括一个cookie图标和一个地球图标。将四个盒子中的每一个连接到云形状是一条两端都有箭头的线。

身份验证代理方法


一种常见的模式是,每个本地应用程序都有自己的嵌入式WebView,以防止其参与SSO。为了解决这种情况,Microsoft Entra ID对本机应用程序使用身份验证代理(auth-broker)方法,如下图所示。

该图说明了身份验证代理在本机应用程序中的使用。

图表标题:身份验证代理方法。出现在图表顶部中心的是一个包含Microsoft Entra ID图标的云形状。云形状下方是一个带有标签Auth Broker的矩形形状。矩形形状包含一个cookie图标和一个地球图标。连接云形状和矩形形状的是一条两端都有箭头的线。图的底部是四个水平排列的方框。每个框的右下角都有一个代表用户的图标。每个框中的图标代表浏览器窗口。将四个盒子中的每一个连接到矩形形状是一条两端都有箭头的线。

有了身份验证代理,应用程序会向代理发送身份验证请求,而不是直接向Microsoft身份平台发送。这样,代理就成为设备上所有身份验证的共享表面。

除了提供共享表面外,身份验证代理还提供了其他好处。采用零信任时,企业可能希望应用程序仅从企业管理的设备运行。企业设备管理的示例包括完整的移动设备管理(MDM)和用户携带自己的设备参与移动应用程序管理(MAM)的场景。

根据设计,底层操作系统(OS)隔离浏览器。开发人员需要与操作系统建立更紧密的联系,才能完全访问设备详细信息。在Windows中,身份验证代理是Windows Web帐户管理器(WAM)。在其他设备上,身份验证代理要么是Microsoft Authenticator应用程序(适用于运行iOS或Android的设备),要么是公司门户应用程序(用于运行安卓的设备)。应用程序通过SOAP访问身份验证代理。在Windows中,应用程序可以访问WAM而无需使用制表符。然而,对于应用程序(尤其是不是通用Windows平台应用程序的应用程序)来说,SSO是访问身份验证代理的最简单方法。

身份验证代理与Microsoft Entra ID结合使用,以利用主刷新令牌(PRT),从而减少用户多次身份验证的需要。PRT可以确定用户是否在受管设备上。Microsoft Entra ID需要身份验证代理,因为它引入了占有证明令牌,这是一种比当今流行的不记名令牌更安全的选择。

下一步

本文地址
最后修改
星期四, 七月 25, 2024 - 14:19
Article