【发布时间】:2015-08-18 23:08:32
【问题描述】:
我正在尝试针对 Azure 移动服务应用对 HTML 应用进行身份验证。
设置
两个应用程序都使用 AAD 作为身份验证后端,因此两个应用程序都在 Active Directory 中注册了一个应用程序:
Azure 移动服务应用:
- 配置如https://azure.microsoft.com/en-gb/documentation/articles/mobile-services-how-to-register-active-directory-authentication/ 中所述
- 我编辑了清单以启用客户端流程
- 在“Windows Azure Active Directory”的“其他应用程序的权限”下启用“单点登录和读取用户配置文件”
HTML 应用程序:
- 在“对其他应用程序的权限”中,我添加了具有委派权限“访问”的 Azure 移动服务应用程序
Azure 移动服务使用 .NET 后端,我在其中包含并配置了 NuGet 包“Microsoft Azure 移动服务 .NET 后端安全扩展”,如 https://azure.microsoft.com/en-gb/documentation/articles/mobile-services-dotnet-backend-windows-phone-get-started-users/ 中所述
HTML 应用使用 ADAL.JS 和 Angular:
adalAuthenticationServiceProvider.init(
{
// Config to specify endpoints and similar for your app
clientId: "<html app aad client id>",
redirectUri: "<html app redirect uri>",
endpoints: {
'<AMS app client id>': 'https://ampapp.azure-mobile.net/'
}
},
$httpProvider
);
此设置按预期工作,我打开我的 html 应用程序,针对 Azure AD 进行身份验证,重定向到我的应用程序并登录。此外,当我尝试访问我的 Azure 移动服务时,我看到了 Adal.js注入不记名令牌。
问题
Azure 移动服务不接受不记名令牌 - 我收到 401 未授权。我不知道为什么,但 Azure 移动服务使用它自己的身份验证标头 - 但没关系。
MSDN 为 Azure 移动服务定义了所谓的“客户端登录操作”:
“使用已从身份提供者获得的身份令牌从 Microsoft Azure 移动服务请求身份验证令牌。” (https://msdn.microsoft.com/en-us/library/azure/jj710106.aspx)
好的,让我们这样做:
// obtain token for Azure Mobile Service from Adal.js
var token = this.getAADToken(ZUMOAuthenticationProvider.Config().url);
$http({
method: 'POST',
url: ZUMOAuthenticationProvider.Config().url + 'login/aad',
data: JSON.stringify({
"access_token" : token
}),
headers: {
'X-ZUMO-APPLICATION': '<application key>'
}).
success(function (data, status, headers, config) {
alert(data);
}).
error(function (data, status, headers, config) {
alert(data);
});
注意:第一行获取的令牌实际上是 azure 移动服务 aad 应用程序的访问令牌,而不是 HTML 应用程序的访问令牌。
这个 POST 请求也会得到 401 响应。所以我不知道如何验证我的应用程序。我还尝试了 azure 移动服务 js lib。这个库可以工作,但它使用弹出窗口进行身份验证,但我不喜欢为我的项目添加另一个库,只是为了几个 REST 调用。
类似问题
在尝试解决我的问题时,我发现了其他 Stackoverflow 帖子:
Why isn't my Azure Mobile Service accepting the bearer token ADAL.js is sending it?
- 同样的问题,没有解决方案(即使在最后一条评论中链接的聊天日志中)
How do I secure an Azure Mobile Service with Azure AD? ADAL.JS
- 与上述相同的作者,我检查了接受的答案中提到的所有内容,但它不起作用
我还从新的 Azure 管理门户查看了新的 Azure 移动应用,但它们似乎使用相同的身份验证机制。
那么,我怎样才能让它工作呢?
【问题讨论】:
-
那么,您在 AAD 中设置了两个应用程序吗?您是否在它们上都启用了客户端流?
-
是的,Azure AD 中有 2 个应用程序,两个客户端流都已启用,因为它们都应该能够通过 JS 进行身份验证。重要提示:应授予 HTML 应用访问 Azure 移动服务
-
您能否将您发送到 /login/aad 端点的 JWT 示例发送给我,以便我可以将其与我的进行比较。
-
检查 JWT 中的有效负载的好资源是“jwt.io”这个网站有工具可以解码你的令牌内容。我在验证使用 Auth0 获得的令牌时遇到问题。我将此与使用纯天蓝色时获得的令牌进行了比较,发现它完全不同。
标签: c# azure mobile azure-mobile-services adal