应用程序之间的Azure AD身份验

Hir*_*sai 5 asp.net asp.net-mvc active-directory azure azure-active-directory

我有一个应用程序让我们将其命名为'Apple',它在Azure AD中注册,具有Azure Management API应用程序的委派权限.当请求此应用程序时,它会创建azure资源.存储帐户自动,这很好.

我有另一个应用程序是MVC应用程序,它也在同一个AD租户注册.第二个应用程序使用以下代码来检索访问令牌:

 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;
Run Code Online (Sandbox Code Playgroud)

结果是具有不同属性的访问令牌.现在第二个应用程序,通过访问资源apple来检索访问令牌,然后将其传递给授权标头中的Apple应用程序.

Authorization:bearer TokenString
Run Code Online (Sandbox Code Playgroud)

Apple应用程序将"授权"属性添加到控制器.该应用程序使用带有oauth应用程序的Owin进行配置,并带有以下代码

public void ConfigureAuth(IAppBuilder app)
    {
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                TokenValidationParameters = new TokenValidationParameters
                {

                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                },
            });
    }
Run Code Online (Sandbox Code Playgroud)

请注意,使用自己的AppId和Secret密钥从第二个应用程序检索访问令牌; 而另一个(Apple)应用程序使用自己的AppId和密钥来验证令牌.

所以我的问题是,APPLE应用程序总是返回401而不是授权代码

Hir*_*sai 0

对于上面的问题,答案是,资源 ID(在令牌请求期间)和受众 ID(在第二个应用程序中验证令牌期间)不匹配。保持这些相同解决了问题。

然后我遇到了另一个问题,我已经在这里描述了

看来,如果我使用较新的 Azure 门户(仍处于预览版本),则令牌中AD token不包含字段。如果我在旧门户中遵循相同的过程来配置应用程序,则 AD 会在令牌中包含字段,并且场景会按预期执行。"Roles"JWT"Roles"JWT

我至少应该避免使用 Azure 新门户来实现预览功能!