使用Azure AD和WebAPI进行服务身份验证服务

时间:2017-03-08 09:27:55

标签: asp.net active-directory azure-active-directory adal

我创建了一个.NET核心Web应用程序,该应用程序使用Azure AD作为标识。这一切都正常工作正常,我使用[Authroize]装饰的任何东西都受到保护。

我现在想要保护我的一个API控制器可以从外部服务访问。

我按照本教程解释了服务 - 服务身份验证。

Service to service auth with Azure AD

使用此功能,我设法请求令牌

POST https://login.microsoftonline.com/{TENANTID}/oauth2/token
grant_type=client_credentials
&client_id={CLIENTID}
&client_secret={CLIENTSECRET}
&resource=https%3A%2F%mydirectory.onmicrosoft.com/myappname

使用邮递员运行这个,我得到了Bearer access_token,所以看起来不错。

现在,如果我在邮递员中使用此标记上的持有人令牌调用我的网络应用程序,

GET https://localhost:44392/api/booking
Authorization Bearer {access_token}

我从Microsoft对话中得到一个HTML响应。所以它似乎只是进入重定向循环,所以我现在很困惑我是否在令牌请求中有配置问题,或者我的Web应用程序是否需要以不同的方式设置。这篇文章提到了清单文件中的权限,但我很困惑为什么这有必要?

enter link description here

enter image description here

一些额外的要点

  • 我的网络应用和令牌的POST使用相同的AD ClientID
  • 我为每个功能(网络和服务到服务)尝试了不同的AD应用程序,但似乎没有任何区别
  • 如果我只是在浏览器上执行标准登录,则API端点会按预期结算。

任何帮助表示赞赏!

更新

我设法尝试使用Daemon .NET 4.5应用程序,并使用UseWindowsAzureActiveDirectoryBearerToken

完美运行

Daemon Service to service auth on .NET 4.5

然而,在我的.NET Core应用程序中,这个中间件不可用,所以我尝试使用JwtBearer中间件,但我仍然得到登录提示。

app.UseJwtBearerAuthentication(new JwtBearerOptions
            {
                Audience = "https://localhost:44392",
                Authority = "https://login.microsoftonline.com/{TENANTNAME}.onmicrosoft.com"
            });

正如您所看到的,我只在BearerOptions中设置了2个属性,但我相信它们应该足以[授权]我的API端点。

1 个答案:

答案 0 :(得分:0)

  

POST https://login.microsoftonline.com/ {CLIENTID} / oauth2 / token

首先获取令牌时,令牌点不正确,我们应该使用tenantId而不是clientId

要解决此问题,我建议您解析来自this site的access_token,以查看令牌中的aud声明是否与您在网络API项目中配置的Audience相同