简化 Web 应用程序与 Windows Azure Active Directory、ASP.NET 和 Visual Studio 的集成
大家好!
今天的博文深入讨论我们今天推出的开发人员工具和框架中的一些新功能。我们通过与 ASP.NET 和 Visual Studio 团队合作开发了一些重大的增强功能,让开发人员能够轻松使用 Windows Azure Active Directory 作为其身份验证服务。
我们今天的客座博友是 Vittorio Bertocci,很多人都是通过他的许多个人演讲和网络广播认识他的。Vittorio 是 Active Directory 团队的首席项目经理,可能是我们最著名的团队成员。他和 ASP.NET 团队就此项目开展了密切合作。
此致!
Alex (Twitter @Alex_A_Simons)
---------------------------------------------------------------
大家好!
过去的几个月,我与 ASP.NET 团队密切协作,使 Windows Azure Active Directory 成为 Visual Studio 项目创建体验中的一流工具。今天, Sayed 宣布了 ASP.NET and Web Tools for Visual Studio 2013 Preview 的面世,它提供了新的 ASP.NET 项目模板和工具体验,以在项目创建时集成 Windows Azure Active Directory 身份验证和管理功能。我们很高兴最终公开了新功能的预览版,以供您试用!
您可以前往 Sayed 的博客(或 预览版文档)了解全面的概述和版本说明,但简而言之:设想一下这样的功能,只需单击几下即可创建已经配置为对来自您的组织的用户进行身份验证和/或轻松吸引新组织的加入、支持分布式注销、自动刷新身份验证设置以及通过图形 API 安全查询目录的解决方案。这正是新模板为您提供的功能。
如果您有机会阅读当 Windows Azure AD 公开发布时我们发布的开发人员演练:这些新模板会创建使用 LoB 应用程序进行 Web 登录的演练中所述的相同解决方案,甚至是结合所有 Windows Azure GA 演练的解决方案。
深度示例:创建新的多租户应用程序
让我们来看一下使用新工具创建项目,以让您了解一下新功能的工作原理。让我们从头开始使用最高数量的移动部件提前解决应用程序类型 - 多租户应用程序(如此处所述)。
请注意:下面的任何信息对于使用新工具都不是必需的。我们将向已经使用 Windows Azure AD 并想要了解这些新工具与现有项目有何关联的开发人员介绍它的内部工作原理,但实际上,开发人员可能会在几乎不了解底层基础结构的情况下只完成模板向导并获取可用应用程序。
您可以参阅本博文,以了解有关如何获取该版本并在您的机器上进行安装的说明;此外,别忘了,我们仍处于预览版!
首先创建一个新项目;从左侧的项目类型列表中选择 Web。
正如您所看到的,此时有一个单一入口点:ASP.NET Web 应用程序。很简单!选择该入口点并单击“确定”。您将有机会选择要在项目中特别采用的技术。在我们的示例中,我们选择 MVC。
在下一步中,您有机会选择要在项目中特别采用的技术。在我们的示例中,我们选择 MVC。
您可能已经注意到,对话框还会通知您目前所选择的身份验证设置:默认值为 [Individual user Accounts](单个用户帐户),这与您的应用程序保持其自己的帐户数据库(尽管它仍可将凭据验证外包给外部提供程序,如 Facebook)情况对应。
我们想要更改该选项,并连接到 Windows Azure AD。单击 [Change Authentication](更改身份验证)。您将获得一个新对话框,为您提供选择不同身份验证类型(左侧),并提供控件(右侧)以输入实施您的所选设置所需的详细信息。
选择 [Organizational Accounts](组织帐户)。
UI 发生更改以帮助您选择想要创建的应用程序种类:与单个 Windows Azure AD 租户绑定的应用程序、意欲由多个 Windows Azure AD 租户使用的 SaaS 应用程序或与传统本地身份提供程序(如 ADFS2.0 实例)绑定的应用程序。
选择 [Cloud – Multiple Organizations](云 - 多个组织)。
注意:此 UI 会立即显示许多选项。预览之后,我们来看一下简化方式。您需要填写的唯一字段是 [Domain](域)一,因为 Visual Studio 必须知道应使用哪个 Windows Azure AD 租户创建应用程序项。
除默认的单一登录外,[Access Level](访问级别)组合框为您提供向您的应用程序中添加目录读取功能的机会。
如果您没有进行输入,应用程序 ID URI 将由工具自动分配。
单击此屏幕上的 [OK](确定)。
此时,工具将要求您为指定的租户输入 Windows Azure AD 凭据:需要这些凭据才能代表您访问图形,以及自动为项目筹建应用程序项。
完成后,单击 [Create project](创建项目)。
该工具将执行经典项目创建阶段:模板实例化、获取必要的 NuGet 包等。然而,它将在(通过图形 API)在 Windows Azure AD 中创建必要的项,以及将项目位自动配置为支持 Web 登录和图形调用时执行这些阶段。
让我们更加深入地看一下该工具所创建的内容。
Visual Studio 项目中包含的内容
在创建后,项目
- 已使用 Windows Azure AD(协议和 UI 手势)配置了 Web 登录
- 包含审核密钥刷新逻辑所有必要的自动化
- 已经连接以支持单一注销
- 包含用于调用图形的所有凭据和调用逻辑
- 包含生成并处理同意消息的全面登录体验
该逻辑都位于哪里?它通过项目在适当的位置连接在一起。下面是一个快速参考图,以开始您的探索:
Windows Azure AD 中的应用程序项
这解决了 Visual Studio 项目中包含的内容问题。怎样在 Windows Azure AD 中创建项?
如果您想要前往 Windows Azure 门户并选择您的应用程序列表,您将发现已经创建新的项(与 Visual Studio 项目具有相同的名称)。
是否想要更深入地了解一下?前往 Graph Explorer,通过请求 https://graph.windows.net/<您的租户名称>/applications 登录并列出您的应用程序。搜索您的项目名称,您将看到一条与以下内容类似的项:
{
"odata.type": "Microsoft.WindowsAzure.ActiveDirectory.Application",
"objectType": "Application",
"objectId": "312176b3-d708-4a79-ad94-e16c3b690cab",
"appId": "a9ab4c5e-b862-4c7c-ace7-4247e5d8ce4d",
"availableToOtherTenants": true,
"displayName": "MyMult1tenantApp",
"errorUrl": null,
"homepage": "https://localhost:44307/",
"identifierUris": [
"https://cloudidentity.net/MyMult1tenantApp"
],
"keyCredentials": [],
"mainLogo@odata.mediaContentType": "image",
"logoutUrl": null,
"passwordCredentials": [
{
"customKeyIdentifier": null,
"endDate": "2014-06-24T06:56:05.9223695Z",
"keyId": "0e59c955-3910-4a27-909d-81d4bf371b3c",
"startDate": "2013-06-24T06:56:05.9223695Z",
"value": null
}
],
"publicClient": null,
"replyUrls": [
"https://localhost:44307/"
],
"samlMetadataUrl": null
},
在上面的项中应注意的是:
-
- AvailableToOtherTenants 位打开,因为您可能期望形成多租户应用程序
- identifierURIs 列表包含工具自动生成的 URI,结合了租户域和项目名称
- ReplyURL 包含开发机器上的 IIS Express 分配给应用程序的地址
假设有一个多租户应用程序在其原始租户中自动可用,我们应预期也为其找到 ServicePrincipal。而且毫无疑问,如果您前往 https://graph.windows.net/<您的租户名称>/servicePrincipals,您将发现一些具有以下效果的项:
{
"odata.type": "Microsoft.WindowsAzure.ActiveDirectory.ServicePrincipal",
"objectType": "ServicePrincipal",
"objectId": "f5be2dd9-cbe4-49bb-b784-3e547ea70770",
"accountEnabled": true,
"appId": "a9ab4c5e-b862-4c7c-ace7-4247e5d8ce4d",
"displayName": "MyMult1tenantApp",
"errorUrl": null,
"homepage": "https://localhost:44307/",
"keyCredentials": [],
"logoutUrl": null,
"passwordCredentials": [],
"publisherName": "Vittorio.Bertocci",
"replyUrls": [
"https://localhost:44307/"
],
"samlMetadataUrl": null,
"servicePrincipalNames": [
"https://cloudidentity.net/MyMult1tenantApp",
"a9ab4c5e-b862-4c7c-ace7-4247e5d8ce4d"
],
"tags": []
}
不出所料;我们真正想要从 ServicePrincipal 获得的是其对象 ID,因此我们可以验证工具实际上是否根据请求在 Directory Readers 角色中添加了应用程序:您可通过使用表格查询进行验证https://graph.windows.net/<您的租户名称>/servicePrincipals/<serviceprincipal 对象 ID>/memberOf。
{
"odata.metadata": "https://graph.windows.net/cloudidentity.net/$metadata#directoryObjects",
"value": [
{
"odata.type": "Microsoft.WindowsAzure.ActiveDirectory.Role",
"objectType": "Role",
"objectId": "88d8e3e3-8f55-4a1e-953a-9b9898b8876b",
"description": "Allows access to various read only tasks in the directory. ",
"displayName": "Directory Readers",
"isSystem": true,
"roleDisabled": false
}
]
}
毫无疑问,一切均如预期。:-)
运行项目
项目已做好在创建后立即运行的准备。在 Visual Studio 中单击 F5:您将获得以下屏幕。
除主题和很少的表面差异外,这实际上是多租户应用程序演练中描述的项目,但没有从头开始编写以及在 Windows Azure AD 门户中手动设置。您可以使用新租户注册、登录、查询图形、注销… 全部随时可用。非常得心应手
后续步骤
这只是首次发布这一新的重要功能的预览版。随着我们与 ASP.NET 团队的继续协作,我们将根据反馈调整功能并扩大范围以处理更多应用场景。
通常,您的意见和建议对于我们确定工作的优先顺序超级重要:请试用新的 ASP.NET and Web Tools for Visual Studio 2013,并与我们分享您的观点!
此致!
Vittorio