Azure AD:为什么清单在 运行 New-MsolServicePrincipalCredential 之后有空的 keyCredentials?
Azure AD: why manifest has empty keyCredentials after running New-MsolServicePrincipalCredential?
或者 keyCredentials 可以为空吗?
可能是第一步哪里出错了,但还不确定。
预期结果: 应用程序清单在 keyCredentials 中包含 Cert Secrets,因此应用程序可以按照描述执行令牌化身份验证 here
实际结果: keyCredentials 为空
第 1 步:通过 运行 在 AD 中创建应用程序:
$azureAdApplication=New-AzureADApplication -DisplayName "SetupTest1008" -HomePage "http://www.SetupTest8.com" -IdentifierUris "http://SetupTest8" -Password "SetupTest1234"
$azureAdApplicationPrincipal=New-AzureADServicePrincipal -ApplicationId $azureAdApplication.ApplicationId
备注:
根据此 article,$azureAdApplication.ApplicationId 将用于上传证书密码
步骤 2:准备好证书密码
.\makecert.exe -r -pe -n "CN=123456" -b 12/15/2014 -e 12/15/2016 -ss my -len 2048 c:\tmp3456.cer
connect-msolservice -credential $credentials
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate
$cer.Import("c:\tmp3456.cer")
$binCert = $cer.GetRawCertData()
$credValue = [System.Convert]::ToBase64String($binCert);
Step3: 上传证书密码
New-MsolServicePrincipalCredential -AppPrincipalId
$azureAdApplication.ApplicationId -Type asymmetric -Value $credValue -Usage verify
这里的问题是我们在 AAD 中代表您的应用程序的两个单独的目录对象之间存在一些混淆:
- 应用程序对象(全局 - 与清单相关)
- 服务主体(本地 - 与 MSOL CMDLETS 相关)
我们对应用程序对象和服务主体有更正式的描述here,但我会尝试为您提供这些对象之间的一些更一般的区别,以及一些具体示例来解决您在此处看到的带有证书的内容.
应用程序对象是您的应用程序在目录中的全局表示。当您作为应用程序开发人员使用 Azure 管理门户注册您的应用程序时,您将在您的开发人员租户中创建一个应用程序对象,该对象可用于存储有关您的应用程序的全局属性。此外,服务主体会在您的租户中创建,如果您是管理员,它会存储应用程序必须访问您的租户的隐式许可。这就是租户管理员创建的应用程序不提示其用户同意的原因。
现在假设您将应用程序设为多租户,而另一个租户中的用户想要使用它。因为您在主租户中注册了一个 global 应用程序对象,所以其他用户可以发现并登录到您的应用程序。他们在您的租户之外,需要同意您的应用程序,但如果他们这样做,则会在第二个租户中创建一个 local 服务主体,代表您在该租户中的应用程序。此对象不仅存储 user/admin 对您的应用程序的同意,还可以用于存储租户特定属性。例如,如果您想为某个租户添加 vanity/tenant-specific 域和 url,您不想在全局对象上注册这些属性,而只是在该租户的本地服务主体上注册,因此只有他们可以使用这些属性网址。
回到您的具体案例,您可能希望根据您的服务部署到其他租户的方式,提供您的应用程序可以用来进行身份验证的租户特定证书。在这种情况下,您将让外部租户的管理员按照您在问题中描述的方式使用 MSOL PowerShell,他们将能够向其服务主体添加证书。此证书可用于在此租户的上下文中对您的应用程序进行身份验证,但不能在此租户之外使用,因为它仅在服务主体上本地注册。
另一方面,如果您想更新您的全局证书,以便您可以使用新密钥在任何租户的上下文中进行身份验证,那么您将更改您的应用程序对象,该对象可通过以下方式访问您在 Azure 管理门户中的应用程序清单。
这就是为什么您看不到 AAD PowerShell 所做的更改会影响您的清单:最终,您正在更改两个不同的对象,这两个对象在不同的上下文中都代表您的应用程序。
如果您需要一种修改应用程序对象的编程方式,我建议您使用图表 API。不幸的是,AAD PowerShell 目前不支持 reading/modifying 您的应用程序对象,但将来应该会支持。以下是通过图表 API 显示的 application entity 的一些详细信息。您应该在 keyCredentials 属性.
上创建一个 POST/PATCH
希望对您有所帮助,
肖恩·塔布里齐
或者 keyCredentials 可以为空吗? 可能是第一步哪里出错了,但还不确定。
预期结果: 应用程序清单在 keyCredentials 中包含 Cert Secrets,因此应用程序可以按照描述执行令牌化身份验证 here
实际结果: keyCredentials 为空
第 1 步:通过 运行 在 AD 中创建应用程序:
$azureAdApplication=New-AzureADApplication -DisplayName "SetupTest1008" -HomePage "http://www.SetupTest8.com" -IdentifierUris "http://SetupTest8" -Password "SetupTest1234"
$azureAdApplicationPrincipal=New-AzureADServicePrincipal -ApplicationId $azureAdApplication.ApplicationId
备注: 根据此 article,$azureAdApplication.ApplicationId 将用于上传证书密码
步骤 2:准备好证书密码
.\makecert.exe -r -pe -n "CN=123456" -b 12/15/2014 -e 12/15/2016 -ss my -len 2048 c:\tmp3456.cer
connect-msolservice -credential $credentials
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate
$cer.Import("c:\tmp3456.cer")
$binCert = $cer.GetRawCertData()
$credValue = [System.Convert]::ToBase64String($binCert);
Step3: 上传证书密码
New-MsolServicePrincipalCredential -AppPrincipalId
$azureAdApplication.ApplicationId -Type asymmetric -Value $credValue -Usage verify
这里的问题是我们在 AAD 中代表您的应用程序的两个单独的目录对象之间存在一些混淆:
- 应用程序对象(全局 - 与清单相关)
- 服务主体(本地 - 与 MSOL CMDLETS 相关)
我们对应用程序对象和服务主体有更正式的描述here,但我会尝试为您提供这些对象之间的一些更一般的区别,以及一些具体示例来解决您在此处看到的带有证书的内容.
应用程序对象是您的应用程序在目录中的全局表示。当您作为应用程序开发人员使用 Azure 管理门户注册您的应用程序时,您将在您的开发人员租户中创建一个应用程序对象,该对象可用于存储有关您的应用程序的全局属性。此外,服务主体会在您的租户中创建,如果您是管理员,它会存储应用程序必须访问您的租户的隐式许可。这就是租户管理员创建的应用程序不提示其用户同意的原因。
现在假设您将应用程序设为多租户,而另一个租户中的用户想要使用它。因为您在主租户中注册了一个 global 应用程序对象,所以其他用户可以发现并登录到您的应用程序。他们在您的租户之外,需要同意您的应用程序,但如果他们这样做,则会在第二个租户中创建一个 local 服务主体,代表您在该租户中的应用程序。此对象不仅存储 user/admin 对您的应用程序的同意,还可以用于存储租户特定属性。例如,如果您想为某个租户添加 vanity/tenant-specific 域和 url,您不想在全局对象上注册这些属性,而只是在该租户的本地服务主体上注册,因此只有他们可以使用这些属性网址。
回到您的具体案例,您可能希望根据您的服务部署到其他租户的方式,提供您的应用程序可以用来进行身份验证的租户特定证书。在这种情况下,您将让外部租户的管理员按照您在问题中描述的方式使用 MSOL PowerShell,他们将能够向其服务主体添加证书。此证书可用于在此租户的上下文中对您的应用程序进行身份验证,但不能在此租户之外使用,因为它仅在服务主体上本地注册。
另一方面,如果您想更新您的全局证书,以便您可以使用新密钥在任何租户的上下文中进行身份验证,那么您将更改您的应用程序对象,该对象可通过以下方式访问您在 Azure 管理门户中的应用程序清单。
这就是为什么您看不到 AAD PowerShell 所做的更改会影响您的清单:最终,您正在更改两个不同的对象,这两个对象在不同的上下文中都代表您的应用程序。
如果您需要一种修改应用程序对象的编程方式,我建议您使用图表 API。不幸的是,AAD PowerShell 目前不支持 reading/modifying 您的应用程序对象,但将来应该会支持。以下是通过图表 API 显示的 application entity 的一些详细信息。您应该在 keyCredentials 属性.
上创建一个 POST/PATCH希望对您有所帮助, 肖恩·塔布里齐