我有一个应用程序,我们将其命名为“Apple”,该应用程序已在 Azure AD 中注册,拥有 Azure 管理 API 应用程序的委派权限。当向该应用程序发出请求时,它会创建 azure 资源。存储帐户会自动运行,效果很好。
我有另一个应用程序,它是 MVC 应用程序,它也注册到相同的 AD 租户。第二个应用程序使用以下代码来检索访问 token :
var clientCredentials = new ClientCredential(ConfigurationManager.AppSettings["AD_ClientID"], ConfigurationManager.AppSettings["AD_Client_AccessKey"]);
var authContext = new AuthenticationContext(string.Format(ConfigurationManager.AppSettings["AD_Tenant_Login_Url"], ConfigurationManager.AppSettings["AD_Tenant_Id"]));
var result = authContext.AcquireTokenAsync(ConfigurationManager.AppSettings["AD_Resource"], clientCredentials);
if (result == null)
{
throw new InvalidOperationException("Could not get the token");
}
return result.Result;
结果是具有不同属性的访问 token 。现在,第二个应用程序检索具有对资源 apple 的访问权限的访问 token ,然后将其传递到授权 header 中的 Apple 应用程序。
Authorization:bearer TokenString
Apple 应用程序已将 Authorize 属性添加到 Controller 。 该应用程序使用 Owin 和 oauth 应用程序进行配置,代码如下
public void ConfigureAuth(IAppBuilder app)
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
},
});
}
请注意,访问 token 是使用第二个应用程序自己的 AppId 和 key 检索的;而另一个(Apple)应用程序使用自己的 AppId 和 key 来验证 token 。
所以我的问题是,APPLE应用程序总是返回401未授权代码
最佳答案
对于上面的问题,答案是,资源 ID(在 token 请求期间)和受众 ID(在第二个应用程序中验证 token 期间)不匹配。保持这些相同解决了问题。
然后我遇到了另一个问题,我已经描述了 here
看来,如果我使用较新的 Azure 门户(仍处于预览版本),AD token
不包括"Roles"
领域 JWT
token 。如果我在旧门户中遵循相同的过程来配置应用程序,则 AD 包括 "Roles"
领域 JWT
token 和场景按预期执行。
我至少应该避免使用 Azure 新门户来实现预览功能!
关于asp.net - 应用程序之间的 Azure AD 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39672739/