借助 Azure Active Directory 开发 ASP.NET 应用

作者 :Rick Anderson

适用于 Azure Active Directory 的 Microsoft ASP.NET 工具简化了为 Azure 上托管的 Web 应用启用身份验证的过程。 可以使用 Azure 身份验证对组织中的Office 365用户、从本地 Active Directory 同步的公司帐户或在你自己的自定义 Azure Active Directory 域中创建的用户进行身份验证。 启用 Windows Azure 身份验证可将应用程序配置为使用单个 Azure Active Directory 租户对用户进行身份验证。

本教程介绍如何创建配置为使用 Azure Active Directory 登录的 ASP.NET 应用程序 (Azure AD) 。 你还将了解如何调用图形 API以获取有关当前已登录用户以及如何将应用程序部署到 Azure 的信息。

先决条件

  1. Visual Studio Express 2013 网页版或Visual Studio 2013版。
  2. Visual Studio 2013 Update 4 - 需要更新 3 或更高版本。
  3. 一个 Azure 帐户。 如果还没有帐户,请单击此处获取免费试用版。

将全局管理员添加到 Active Directory

  1. 登录到 Azure 管理门户

  2. 所有 Azure 帐户都包含 一个默认目录 -- 单击它,然后单击页面顶部的“ 用户 ”选项卡, (看到下图) 。

  3. 单击“添加用户”。 Azure 管理门户的屏幕截图,其中左侧概述了并选中了“默认目录”,右侧概述了“用户”,在页脚中概述了“添加用户”。

  4. 创建具有 全局管理员 角色的新用户。 单击顶部菜单中的“ 用户 ”,然后单击命令栏上的“ 添加用户 ”按钮。

  5. 在“ 添加用户 ”对话框中,输入新用户的名称,然后单击向右箭头。

    “添加用户”对话框的屏幕截图,其中包含说明“告诉我们有关此用户的信息”。将显示“用户类型”和“用户名”字段。

  6. 输入用户名,并将角色设置为 “全局管理员”。 全局管理员需要备用电子邮件地址来恢复密码。 完成后,单击向右箭头。

    “添加用户”对话框中用户配置文件的屏幕截图,其中为 ROLE 选择了“全局管理员”。突出显示了“备用电子邮件地址”字段。

  7. 在对话框的下一页上,单击“ 创建”。 将为新用户创建临时密码,并显示在对话框中。

    “添加用户”对话框中用户配置文件的屏幕截图,其中显示了“获取临时密码说明”,下面显示了“创建”按钮。

    保存密码,首次登录后需要更改密码。 下图显示了新的管理员帐户。 必须使用 Azure Active Directory 登录到应用,而不是此页面上也显示的 Microsoft 帐户。

    新管理员帐户的屏幕截图,表中显示了“显示名称”、“用户名”和“SOURCED FROM”列。

创建 ASP.NET 应用程序

以下步骤使用 Visual Studio Express 2013 for Web,并且需要Visual Studio 2013 Update 3

  1. 在 Visual Studio 中,单击“ 文件 ”,然后单击“ 新建项目”。 在“ 新建项目 ”对话框中,从左侧菜单中选择 Visual C# Web 项目,然后单击“ 确定”。 如果不需要应用程序的功能,可能还需要取消选中 “将 Application Insights 添加到 Project ”。

  2. 在“ 新建 ASP.NET 项目 ”对话框中,选择“ MVC”,然后单击“ 更改身份验证”。

    “新建 A S P dot NET 项目”对话框的屏幕截图,其中选择了“M V C 模板”,其中概述了“更改身份验证”按钮,并选择了“在云中托管”。

  3. 在“ 更改身份验证 ”对话框中,选择“ 组织帐户”。 这些选项可用于向 Azure AD 自动注册应用程序,以及自动配置应用程序以与 Azure AD 集成。 无需使用“ 更改身份验证 ”对话框来注册和配置应用程序,但这样可以更轻松地注册和配置应用程序。 例如,如果使用 Visual Studio 2012,仍可以在 Azure 管理门户中手动注册应用程序,并更新其配置以与 Azure AD 集成。 在下拉菜单中,选择“云 - 单一组织”,单一登录“读取目录数据”。 输入 Azure AD 目录的域(例如,下图中的 () aricka0yahoo.onmicrosoft.com),然后单击“ 确定”。 可以从 Azure 门户上“默认目录”的“域”选项卡获取域名, () 查看下一张图像。

    “更改身份验证”对话框的屏幕截图;组织帐户、云短划线单一组织和单一登录、读取概述的目录数据。

    下图显示了Azure 门户中的域名。

    Azure 门户的屏幕截图,左侧选择了“默认目录”,右侧菜单中突出显示了“域”,目录域名如下所示。

    注意

    可以选择性地通过单击“ 更多选项”来配置将在 Azure AD 中注册的应用程序 ID URI。 应用 ID URI 是应用程序的唯一标识符,在 Azure AD 中注册,应用程序在与 Azure AD 通信时用于标识自身。 有关已注册应用程序的应用 ID URI 和其他属性的详细信息,请参阅 本主题。 通过单击“应用 ID URI”字段下方的复选框,还可以选择覆盖 Azure AD 中使用相同的应用 ID URI 的现有注册。

  4. 单击“ 确定”后,将显示登录对话框,你需要使用全局管理员帐户 (而不是与订阅) 关联的 Microsoft 帐户登录。 如果之前创建了新的管理员帐户,则需要更改密码,然后使用新密码再次登录。

    “登录到 Azure Active Directory”对话框的屏幕截图,其中显示了“全局管理员帐户名称和密码”字段。

  5. 成功进行身份验证后,“新建 ASP.NET 项目”对话框将显示身份验证选项 (组织) ,并在下图) aricka0yahoo.onmicrosoft.com (新应用程序注册目录。 在此信息下方,选中标记为“ 在云中托管”的复选框。 如果选中此复选框,项目将预配为 Azure Web 应用,并启用以便稍后发布。 单击 “确定”

    “新建 A S P dot NET 项目”对话框的屏幕截图,其中显示了 M V C 模板、身份验证选项和目录。概述了云中的主机。

  6. 将显示 “配置 Azure 网站 ”对话框,使用自动生成的站点名称和区域。 另请注意对话框中当前登录的帐户。 你希望确保此帐户是 Azure 订阅所附加到的帐户,通常是 Microsoft 帐户。

    注意

    此项目需要数据库。 需要选择一个现有数据库,或创建一个新数据库。 数据库是必需的,因为项目已使用本地数据库文件来存储少量的身份验证配置数据。 将应用程序部署到 Azure 网站时,此数据库不会随部署一起打包,因此需要选择一个可在云中访问的数据库。 单击 “确定”

    “配置 Azure 网站”对话框的屏幕截图,其中显示了自动生成的站点名称、区域、数据库服务器、数据库用户名和数据库密码。

  7. 将创建项目,并且身份验证选项和 Web 应用选项将自动与项目一起配置。 完成此过程后,按 ^F5 在本地运行项目。 需要使用组织帐户登录。 提供之前创建的帐户的用户名和密码,然后单击“ 登录”。

    “登录”对话框的屏幕截图,其中显示了组织帐户用户名和密码的字段。

  8. 成功登录后,ASP.NET 网站将通过在页面右上角显示用户名来显示你已进行身份验证。

    A S P dot NET 站点的屏幕截图,地址栏中突出显示了你,并在右上角突出显示了用户名。

    如果收到错误:值不能为 null 或空。 参数名称:linkText 服务器错误的屏幕截图。错误消息突出显示,读取,值不能为 null 或为空。参数名称冒号链接 Text。

    请参阅本教程末尾的 调试 部分。

图形 API基础知识

图形 API是用于对 Azure AD 目录中的对象执行 CRUD 和其他操作的编程接口。 如果在 Visual Studio 2013 中创建新项目时选择“组织帐户”选项进行身份验证,则应用程序已配置为调用图形 API。 本部分简要介绍了图形 API的工作原理。

  1. 在正在运行的应用程序中,单击页面右上角的已登录用户的名称。 这会将你带到“用户配置文件”页,该页是主控制器上的一项操作。 你会注意到,该表包含有关之前创建的管理员帐户的用户信息。 此信息存储在目录中,并调用 图形 API,以在页面加载时检索此信息。

    “用户配置文件”页的屏幕截图,其中包含一个表,其中包括管理员帐户的“显示名称”、“名字”和“姓氏”。

  2. 返回 Visual Studio 并展开 Controllers 文件夹,然后打开 HomeController.cs 文件。 你将看到 UserProfile () 操作,该操作包含用于检索令牌的代码,然后调用图形 API。 以下代码重复:

    [Authorize]
    public async Task UserProfile()
    {
        string tenantId = ClaimsPrincipal.Current.FindFirst(TenantIdClaimType).Value;
    
        // Get a token for calling the Azure Active Directory Graph
        AuthenticationContext authContext = new AuthenticationContext(String.Format(CultureInfo.InvariantCulture, LoginUrl, tenantId));
        ClientCredential credential = new ClientCredential(AppPrincipalId, AppKey);
        AuthenticationResult assertionCredential = authContext.AcquireToken(GraphUrl, credential);
        string authHeader = assertionCredential.CreateAuthorizationHeader();
        string requestUrl = String.Format(
            CultureInfo.InvariantCulture,
            GraphUserUrl,
            HttpUtility.UrlEncode(tenantId),
            HttpUtility.UrlEncode(User.Identity.Name));
    
        HttpClient client = new HttpClient();
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
        request.Headers.TryAddWithoutValidation("Authorization", authHeader);
        HttpResponseMessage response = await client.SendAsync(request);
        string responseString = await response.Content.ReadAsStringAsync();
        UserProfile profile = JsonConvert.DeserializeObject<UserProfile>(responseString);
    
        return View(profile);
    }
    

    若要调用图形 API,首先需要检索令牌。 检索令牌时,必须为所有后续请求追加到图形 API的授权标头中。 上述大部分代码处理向 Azure AD 进行身份验证以获取令牌的详细信息,使用令牌调用图形 API,然后转换响应,使其显示在视图中。

    讨论最相关的部分是以下突出显示的行: UserProfile profile = JsonConvert.DeserializeObject<UserProfile>(responseString);。 此行表示用户的名称,该名称已从 JSON 响应中反序列化并显示在视图中。

    可以使用 HttpClient 调用图形 API并自行处理原始数据,但更简单的方法是使用可通过 NuGet 获取的 Graph 客户端库。 客户端库为你处理原始 HTTP 请求和返回数据的转换,使在 .NET 环境中使用图形 API变得更加容易。 请参阅 GitHub 上的相关图形 API代码示例。

将应用程序部署到 Azure

以下步骤将演示如何将应用程序部署到 Azure。 在前面的步骤中,你已将新项目与 Azure 上的 Web 应用连接,因此只需几个步骤即可将其发布。

  1. 在 Visual Studio 中,右键单击项目并选择“ 发布”。 将显示 “发布 Web ”对话框,其中每个设置都已配置。 单击“ 下一步 ”按钮转到 “设置” 页。 系统可能会提示你进行身份验证;请确保使用 Azure 订阅帐户进行身份验证, (通常是) Microsoft 帐户,而不是之前创建的组织帐户。

    “发布 Web”对话框的屏幕截图,其中突出显示了“连接”,并在右侧配置了每个设置。

  2. 选中 “启用组织身份验证” 选项。 在 “域” 字段中,输入目录的域。 从“访问级别”下拉列表中,选择“单一登录读取目录数据”。 你会注意到,以前使用的数据库已在 “数据库” 部分中填充。 单击“发布” 。

    “发布 Web”对话框的屏幕截图。概述了文件发布选项,包括启用组织身份验证、域字段和访问级别。

  3. Visual Studio 将开始部署网站,然后将显示一个新的浏览器窗口。 系统可能会提示你再次向目录进行身份验证。 进行身份验证后,系统会将你重定向到 Azure 上新发布的网站。

    A S P dot NET 站点的屏幕截图,其中显示了 Azure 上新发布的网站的 L,显示在地址栏中。

调试应用

如果收到以下错误:值不能为 null 或为空。 参数名称:linkText

可能导致的 erver 错误的屏幕截图。突出显示错误消息,读取时,值不能为 null 或为空。参数名称冒号链接 Text。

Views\Shared\_LoginPartial.cshtml 文件中的代码替换为以下内容:

@{
   var user = "Null User";
   if (!String.IsNullOrEmpty(User.Identity.Name))
   {
      user = User.Identity.Name;
   }

}

@if (Request.IsAuthenticated)
{
    <text>
         <ul class="nav navbar-nav navbar-right">
            <li>
                @*@Html.ActionLink(User.Identity.Name, "UserProfile", "Home", routeValues: null, htmlAttributes: null)*@
               @Html.ActionLink(user, "UserProfile", "Home", routeValues: null, htmlAttributes: null)
            </li>
            <li>
                @Html.ActionLink("Sign out", "SignOut", "Account")
            </li>
        </ul>
    </text>
}
else
{
     <ul class="nav navbar-nav navbar-right">
        <li>@Html.ActionLink("Sign in", "Index", "Home", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}

运行应用后,如果登录用户显示“Null 用户”,请注销,然后使用之前创建的 Active Directory 帐户重新登录。

要学习的优秀教程是 Rick Rainey 的 深入探讨:使用 Azure AD 进行 Azure 网站和组织身份验证

更多信息