Azure 网站单一登录以用户身份从 Azure Active Directory 访问 Azure 移动服务

Azure Website Single Sign On accessing Azure Mobile Service from Azure Active Directory as User

本文关键字:Azure Active Directory 访问 服务 移动 身份 网站 单一 登录 用户      更新时间:2023-09-26

我有一个 ASP.NET 的MVC网站部署为Azure网站(称为网站)。该网站有一个需要授权的部分。我已经设置了Windows Azure Active Directory(WAAD)来保护对该部分的访问。加载受保护部分后,它将加载允许与 Azure 移动服务集成的 Javascript 应用。

我还有一个单独的 Azure 移动服务,用于数据存储(称为 mobserv)。我想从网站访问 mobserv 表和 api 端点。我正在使用 Azure 移动服务的 .NET 后端。当然,我需要使用 [AuthorizeLevel] 保护这些 mobserv 端点。

教程展示了当我想作为应用程序进行身份验证(使用 [AuthorizeLevel(AuthorizationLevel.Application)])时如何执行此操作 - 只需添加对正确 Javascript 客户端 (MobileServices.web-1.2.5.js) 的引用,提供 mobserv 应用程序 ID 和令牌。CORS 设置为允许交互。目前为止,一切都好。

但是现在,我想使用 [AuthorizeLevel(AuthorizationLevel.User)] 保护某些端点。因此,现在,请求必须以用户身份授权。由于网站已受 WAAD 保护,因此我不希望客户端为 javascript 客户端执行新的登录 - 我想重用当前的 WAAD 身份验证标头以获得单点登录体验,以便 mobserv 能够识别用户。

我没有找到任何关于如何做到这一点的提示。教程仅显示针对 mobserv 或使用显式登录对话框的应用程序级身份验证。

有人知道如何做到这一点吗?

继vibronet的帖子之后,移动服务确实支持访问令牌的HTTP POST,但访问令牌必须将受众指定为移动服务。因此,为您的网站发行的令牌将无法自行工作。需要通过其中一个 AAD 流对其进行转换。

因此,在 AAD 中,需要有两个 Web 应用程序注册,一个用于网站,一个用于移动服务。在移动服务注册中,需要定义可向其他资源公开的权限。移动服务 + ADAL 教程的第一部分("向 Azure Active Directory 注册移动服务")将引导你完成此操作。然后,无需注册访问该权限的本机客户端应用,而是转到网站注册并在那里配置访问权限。

拥有网站的 AAD 令牌后,可以利用此权限获取移动服务的令牌。这最好使用 Active Directory 身份验证库中的代理流(JS 或 .NET,具体取决于您要执行操作的位置)来完成。AAD 团队有一个关于如何执行此操作的很好示例,移动服务也有一个教程可能会有所帮助,尽管它对 SharePoint Online 进行移动服务访问,而不是对移动服务进行网站访问)

然后,可以使用"客户端流"方法将令牌发送到移动服务,如 HTML/JS SDK 的"如何:对用户进行身份验证"中所述。对于 AAD,调用将如下所示:

client.login(
      "aad",
      {"access_token": "<TOKEN-FROM-AAD>"})
.done(function(results){
      alert("You are now logged in as: " + results.userId);
},
function(error){
      alert("Error: " + err);
});

用户不会看到任何新 UI,但他们将登录,并且来自 SDK 的后续调用将进行身份验证。

从 MVC 后端执行此操作也可能更容易。我相信你可以从 ClaimIdentity 获取访问令牌,然后只需使用移动服务 .NET 客户端 SDK 执行登录操作,并促进从 MVC 站点到移动服务的调用:

JObject payload = new JObject();
payload["access_token"] = "<TOKEN-FROM-AAD>";
MobileServiceUser user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);
无法

实现"按原样"的令牌重用,因为您为网站获取的令牌范围仅限于您的应用,如果转发到任何其他资源,则应被拒绝。从 AAD 的角度来看,有各种流允许你将原始令牌换成旨在与 Web API 一起使用的新令牌 - 所有这些都不需要用户执行任何新操作。但是,您的方案包括一些特定于移动服务的移动部件,因此我不确定如何在此处应用。我正在为移动服务人员标记这篇文章,希望他们能够插话。