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

Azure 使用AAD应用程序密钥和服务主体密码之间的身份验证差异,azure,azure-active-directory,azure-authentication,azure-security,service-principal,Azure,Azure Active Directory,Azure Authentication,Azure Security,Service Principal,要在Azure中运行应用程序,我需要在Azure AD中创建一个应用程序和相应的服务主体。然后,我的应用程序根据此应用程序/主体对进行身份验证。要进行身份验证,我可以在应用程序注册中创建应用程序密钥,也可以在服务主体中创建密码(以及其他选项)。从实践的角度看有什么区别 例如,无论$key是应用程序的密钥还是服务主体的密码,此代码的运行(从外部)都完全相同: 我什么时候应该对应用程序进行身份验证,什么时候应该使用服务主体?首先,让我解释一下为什么它在Azure AD中同时包含应用程序和服务主体。

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

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


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

首先,让我解释一下为什么它在Azure AD中同时包含应用程序和服务主体。下面是Vittorio Bertocci通过Azure AD对Web应用程序进行Mordent身份验证的解释

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

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

如果您想知道Azure AD应用程序密钥和服务原则密码之间的区别,最好了解应用程序和服务原则之间的关系。我将在这里复制并粘贴一些

  • 在Azure门户中注册Azure AD应用程序时,会在Azure AD租户中创建两个对象:应用程序对象和服务主体对象。

  • 将应用程序对象视为应用程序的全局表示形式,供所有租户使用,并将服务主体作为本地表示,以便在特定租户中使用。应用程序对象用作模板,从中派生公共和默认属性,用于创建相应的服务主体对象

  • 因此,应用程序对象与软件应用程序的关系为1:1,与相应的服务主体对象的关系为1:多。必须在使用应用程序的每个租户中创建服务主体,使it能够为登录和/或访问租户保护的资源建立身份

  • 示例图

    摘要

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


    要查看有关Azure Active Directory中应用程序和服务主体对象的更多详细信息,请参阅。

    谢谢!那么下面的推论正确吗?1) 如果我想锁定给定进程的权限,最好让它通过自己的服务主体进行身份验证,而不是通过应用程序密钥进行身份验证?2) 应用程序密钥的主要目的是为其他租户中的服务主体提供向应用程序进行身份验证的方法吗?如果是这样的话,我认为直接使用app密钥进行身份验证是对app密钥的滥用(如上面的代码示例所示)。如果没有,目的是什么?嗨,@jschmitter,对于你的额外问题,我有以下看法:1)我认为这是为了不同的场景,而不是权限。2) 如果你想使用服务原则,你可以为你的应用创建一个密钥,也可以不创建。当你想将你的应用配置为客户端应用以访问WebAPI时,你需要应用密钥。此文档可能对你也有帮助。嗨,@jschmitter,如果此答案对你有帮助,请将其标记为帮助更多人的答案。谢谢!嗨@jschmitter很抱歉我的回答不清楚。该密钥仅用于客户端应用程序访问WebAPI。如果您的应用程序不是客户端应用程序,则它不需要/不具有密钥。示例:当您将应用程序注册为本机应用程序时,它将没有密钥。服务原则将azure作为应用程序登录时不需要此密钥。
        $key = ConvertTo-SecureString $authKeyOrPassword -AsPlainText -Force
        $cred = New-Object System.Management.Automation.PSCredential($appID, $key)
        Add-AzureRmAccount -Credential $cred -TenantId $tenantID -ServicePrincipal