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