使用 AAD 应用程序密钥和服务主体密码之间的身份验证差异

2024-02-04

要在 Azure 中运行应用程序,我需要在 Azure AD 中创建应用程序和相应的服务主体。然后我的应用程序针对此应用程序/主体对进行身份验证。为了进行身份验证,我可以在应用程序注册中创建应用程序密钥,或者可以在服务主体中创建密码(以及其他选项)。从实际角度来看有什么区别?

例如,无论 $key 是应用程序的密钥还是服务主体的密码,此代码的运行完全相同(从外部):

    $key = ConvertTo-SecureString $authKeyOrPassword -AsPlainText -Force
    $cred = New-Object System.Management.Automation.PSCredential($appID, $key)
    Add-AzureRmAccount -Credential $cred -TenantId $tenantID -ServicePrincipal

我什么时候应该对应用程序进行身份验证,什么时候应该使用服务主体?


首先,让我解释一下为什么它在 Azure AD 中同时具有应用程序和服务主体。以下是 Vittorio Bertocci 的 Mordent Authentication with Azure AD for Web App 的解释。

Azure AD 定义了一个新实体,即应用程序,其目的是 将应用程序描述为抽象实体:模板,如果您 将要。作为开发人员,您使用应用程序。在部署时 给定的 Application 对象可以用作创建一个的蓝图 ServicePrincipal 代表应用程序的具体实例 一个目录。 ServicePrincipal 用于定义什么 该应用程序实际上可以在该特定目标目录中执行操作,谁可以使用 它可以访问哪些资源,等等。

请容忍我一下 再过一会儿,抽象部分就快结束了。主要途径是通过 Azure AD 从应用程序创建 ServicePrincipal 是 同意。以下是流程的简化描述:假设您 在目录 A 中创建一个 Application 对象,提供所有 到目前为止,我们已经在前面的章节中讨论了协议坐标。说 租户 B 的用户导航到应用程序的页面并触发 身份验证流程。 Azure AD 对来自 B 的用户进行身份验证 它的主目录 B。这样做时,它发现没有 B 中应用程序的 ServicePrincipal;因此,它会提示用户 他或她是否同意该应用程序访问 目录 B(稍后您将看到其容量)。如果用户授予 同意后,Azure AD 使用 A 中的应用程序对象作为蓝图 在 B 中创建一个 ServicePrincipal。除此之外,B 还记录当前用户同意使用此应用程序(稍后会提供大量详细信息)。完成后,用户会收到用于访问应用程序的令牌。

如果您想了解Azure AD应用程序密钥和服务主体密码之间的区别,您最好了解应用程序和服务主体的关系。我将在这里复制并粘贴一些摘录文档的这一页 https://learn.microsoft.com/azure/active-directory/develop/app-objects-and-service-principals

  1. When you register an Azure AD application in the Azure portal, two objects are created in your Azure AD tenant: an application object, and a service principal object.

  2. Consider the application object as the global representation of your application for use across all tenants, and the service principal as the local representation for use in a specific tenant. The application object serves as the template from which common and default properties are derived for use in creating corresponding service principal objects.

  3. An application object therefore has a 1:1 relationship with the software application, and a 1:many relationships with its corresponding service principal object(s).A service principal must be created in each tenant where the application is used, enabling it to establish an identity for sign-in and/or access to resources being secured by the tenant.

示例图

Summary

现在,我们可以知道Azure AD应用程序密钥和服务主体密码之间的区别。它们属于不同的对象。与服务主体关联的密码。这只是为了应用程序租户登录azure。但是,您可以提供应用程序键值和应用程序 ID,以作为所有租户的应用程序登录。

要查看有关Azure Active Directory中的应用程序和服务主体对象的更多详细信息,您可以参考这个文件 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-application-objects.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 AAD 应用程序密钥和服务主体密码之间的身份验证差异 的相关文章

随机推荐

  • 调用mapViewDidFailLoadingMap委托方法时出现错误== 0

    在我的视图控制器中 我创建了一个 MKMapView 对象 我将委托设置为 self 并在 ViewController 中实现 void mapViewDidFailLoadingMap MKMapView mapView withErr
  • Spring data - 根据先前的插入插入数据

    我需要将数据保存到两个表中 一个实体和一个关联表 我只是用以下命令保存我的实体save 我的实体存储库中的方法 然后 为了性能 我需要将行插入到关联表中原生sql 这些行有我之前保存的实体的引用 问题来了 我得到一个完整性约束异常关于外键
  • jQuery - 窗口焦点、模糊事件未触发 - 适用于 Firefox 和 Chrome

    简而言之 我编写了一个简单的聊天应用程序供我和我的朋友使用 当运行应用程序的窗口没有焦点 最小化或位于其他窗口后面 并且出现消息时 我想更改窗口标题栏以充当警报 就像 Google 的聊天应用程序在 GMail 中所做的那样 在 Firef
  • 如何在 Phpunit 的静态提供程序中创建测试双打?

    Phpunit 10 已弃用非静态测试提供程序 这使得在提供者内部创建测试替身成为问题 因为像这样的方法createMock or createStub 不是静态的 这是一个演示该问题的假测试 public function provide
  • 在单独的线程中执行操作以解锁 UI

    我有一个用于生成报告的表格 我们正在使用RDLC报告并且报告被加载到aspx page 所以这是代码Form 表单目标设置为 blank 并在新选项卡中打开 using Html BeginForm AssetReports AssetRe
  • 根据常识,什么是正确的: (int) blabla * 255.99999999999997 或 round(blabla*255)?

    最近我在 webkit 源代码中发现了这个有趣的事情 与颜色转换 hsl 到 rgb 相关 http osxr org android source external webkit Source WebCore platform graph
  • MongoDB 中多租户数据库的推荐方法是什么?

    我正在考虑使用 MongoDB 创建一个多租户应用程序 我还没有猜测我会有多少租户 但我希望能够扩展到数千个 我可以想到三种策略 同一集合中的所有租户 使用特定于租户的字段来确保安全 单个共享数据库中每个租户 1 个集合 每个租户 1 个数
  • 使用 python 从 LaTeX 文件中提取特定部分

    我有一组 LaTeX 文件 我想为每个提取 抽象 部分 begin abstract end abstract 我已经尝试过这里的建议 如何解析LaTex文件 https stackoverflow com questions 307523
  • 方法的多个返回类型

    我正在尝试用 Rust 编写一个简单的电视剧文件重命名器 文件名被解析 并且可能是多种类型之一 基于日期 基于季节 剧集编号等 然后 此解析后的文件将转换为包含数据库中数据的 填充文件 然后将其格式化为新文件名 最初我尝试让parse方法采
  • DB PHP 中的条目数

    我正在创建一个函数来显示现在有多少用户在线 这是基于过去 5 分钟内打开页面的人 每个页面加载都保存到我的数据库中 如下所示 目前我有以下代码 query mysql query SELECT user id timestamp FROM
  • Vuex - 绑定助手中的动态命名空间(mapState,...)

    我正在动态注册 vuex 存储模块 store registerModule home grid GridStore 然后在组件中 export default name GridComponent props namespace type
  • 哪些版本控制工具可用于 MongoDB [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我计划将基于 mongodb 的迁移工具集成到我的 spring boot 应用程序中 该应用程序在项目中具有 spring data 依赖
  • 在sqlite数据库中保存日志表?

    我正在寻找一种方法来设置 通过 SQL 一个日志表 其中包含对我的 sqlite 数据库所做的所有操作 最好是向数据库发出的插入 创建表等语句 我确信有办法通过在每个表上设置触发器来做到这一点 但这只是太多的工作 而且如果我稍后更改数据库的
  • 在 C# 中通过委托实现观察者模式?

    有一个问题已经回答了 那就是在C 中 观察者模式不是已经使用事件实现了吗 https stackoverflow com questions 32034 in c isnt the observer pattern already impl
  • Rails 验证中的单词计数

    我使用以下验证来计算 Rails 中的单词数 我从 Rails 文档中获取了示例 但它并不真正准确 validates body length gt minimum gt 50 maximum gt 300 tokenizer gt lam
  • 将日志文件保持在一定大小

    我有一个在信息亭 C WPF 中的独立平板电脑上运行的应用程序 它对文本文件执行一些典型的日志记录操作 随着这些日志的增长 PC 具有有限的磁盘空间来存储这些日志 我需要做的是能够指定日志文件允许的最大大小 如果在尝试写入日志时超出最大大小
  • 使用 EF Core 和 MySQL 实现行版本的更好方法?

    如果我在模型中使用以下字段 DatabaseGenerated DatabaseGeneratedOption Computed Timestamp public DateTime RowVersion get set 然后将该列定义为 R
  • Composer 不检测 php7,而是使用 5.6。如何设置 CLI 以使用 php7

    当我执行时在这里php v 它说它有 php7 但是当我尝试执行时composer update 回应它 Your requirements could not be resolved to an installable set of pa
  • MySQL 多重选择、多个Where 子句

    我不想为一项操作运行数百个 SELECT 查询 而是只想运行一个大查询 我希望这能减轻服务器上的负载 SELECT SELECT link type id FROM connections WHERE node to id 0 AND no
  • 使用 AAD 应用程序密钥和服务主体密码之间的身份验证差异

    要在 Azure 中运行应用程序 我需要在 Azure AD 中创建应用程序和相应的服务主体 然后我的应用程序针对此应用程序 主体对进行身份验证 为了进行身份验证 我可以在应用程序注册中创建应用程序密钥 或者可以在服务主体中创建密码 以及其