我创建了一个 .NET core Web 应用程序,它使用 Azure AD 作为身份。这一切都按预期正常工作,并且我使用 [Authorize] 装饰的任何内容都受到保护。
我现在想要确保我的一个 API 控制器能够从外部服务访问。
我遵循了本教程,该教程解释了服务-服务身份验证。
使用 Azure AD 进行服务到服务身份验证 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service
使用这个我成功地请求了一个令牌
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
使用邮递员运行此操作,我得到了不记名 access_token,所以看起来不错。
现在,如果我在 Postman 中调用我的 Web 应用程序,并在标题上使用此不记名令牌,
GET https://localhost:44392/api/booking
Authorization Bearer {access_token}
我从 Microsoft 对话中收到 HTML 响应。所以看起来它只是进入重定向循环,所以我现在很困惑我是否在令牌请求中存在配置问题,或者我的网络应用程序是否需要以不同的方式设置。这里的文章提到了有关清单文件中的权限的一些内容,但我很困惑为什么这是必要的?
在此输入链接描述 http://bitoftech.net/2014/09/12/secure-asp-net-web-api-2-azure-active-directory-owin-middleware-adal/
一些补充要点
- 我的 Web 应用程序和令牌的 POST 使用相同的 AD ClientID
- 我为每个功能(Web 和服务到服务)尝试了不同的 AD 应用程序,但似乎没有任何区别
- 如果我只是在浏览器上执行标准登录,API 端点将按预期解析。
任何帮助表示赞赏!
Updates:
我设法尝试 Daemon .NET 4.5 应用程序,并且使用 UseWindowsAzureActiveDirectoryBearerToken 完美运行
.NET 4.5 上的守护进程服务到服务身份验证 https://github.com/Azure-Samples/active-directory-dotnet-daemon
但是,在我的 .NET Core 应用程序中,此中间件不可用,因此我尝试使用 JwtBearer 中间件,但仍然收到登录提示。
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Audience = "https://localhost:44392",
Authority = "https://login.microsoftonline.com/{TENANTNAME}.onmicrosoft.com"
});
正如您所看到的,我只在 BearerOptions 中设置了 2 个属性,但我相信它们应该足以[授权]我的 API 端点。