用于SPA和守护程序应用的jwt令牌中的不同受众

时间:2017-09-05 09:15:04

标签: angular azure asp.net-core azure-active-directory adal.js

我有一个受Azure AD保护的dotnet核心1.1 Web API。我的Angular SPA使用adal来验证用户身份。我还有一个守护进程应用程序可以执行一些后台作业,它还使用web api来调用功能或检索数据。

它主要基于Microsoft提供的示例,您可以找到here

最大的区别在于我使用的是不同的中间件。 API使用JwtBearerAuthentication

            .UseJwtBearerAuthentication(new JwtBearerOptions
            {
                TokenValidationParameters = tokenValParam,
                AutomaticAuthenticate = true,
                AutomaticChallenge = false,
                Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAD:Tenant"]),
                Audience = Configuration["AzureAd:Audience"],
            })

守护程序应用程序中的标记由以下代码创建:

    var authContext = new AuthenticationContext("https://login.microsoftonline.com/##adId##);
    var clientCredential = new ClientCredential("##serviceCredenitalKey##", "##serviceCredentialSecret##");
    var result = await authContext.AcquireTokenAsync(##webApiUri##, clientCredential);

我面临的问题是AD通过adal为SPA生成的令牌将客户端应用程序的clientId作为受众。为守护程序应用程序生成的令牌没有clientId作为受众,而是web api的uri。无法在中间件中指定多个有效的受众。我应该使用自己的验证器,是否有内置的机制来解决这个问题,或者我完全忽略了这一点。

1 个答案:

答案 0 :(得分:0)

我能想到的最简单的方法是尝试将所有客户端应用设置为使用相同的(受众),客户端ID或api url。在守护程序应用程序中获取web api的令牌时,您可以使用客户端ID作为资源,并且web api接受客户端ID作为验证的受众。如果您想在Web api中支持多个受众,则需要编写自己的验证器。