使用 Windows 身份验证对用户进行身份验证 (C#)

Microsoft

了解如何在 MVC 应用程序的上下文中使用 Windows 身份验证。 了解如何在应用程序的 Web 配置文件中启用Windows 身份验证,以及如何配置 IIS 的身份验证。 最后,你将了解如何使用 [Authorize] 属性将控制器操作的访问限制为特定的 Windows 用户或组。

本教程的目的是说明如何利用 Internet Information Services 中内置的安全功能对 MVC 应用程序中的视图进行密码保护。 了解如何仅允许特定 Windows 用户或属于特定 Windows 组成员的用户调用控制器操作。

当你构建内部公司网站 (Intranet 网站) 并且希望用户在访问网站时能够使用其标准 Windows 用户名和密码时,使用 Windows 身份验证 是有意义的。 如果要构建面向外的网站 (Internet 网站) 请考虑改用 Forms 身份验证。

启用 Windows 身份验证

创建新的 ASP.NET MVC 应用程序时,默认情况下不启用Windows 身份验证。 表单身份验证是为 MVC 应用程序启用的默认身份验证类型。 必须通过修改 MVC 应用程序的 Web 配置 (web.config) 文件来启用Windows 身份验证。 <找到身份验证>部分并将其修改为使用 Windows 而不是窗体身份验证,如下所示:

<authentication mode="Windows">

</authentication>

启用Windows 身份验证后,Web 服务器将负责对用户进行身份验证。 通常,在创建和部署 ASP.NET MVC 应用程序时,可以使用两种不同类型的 Web 服务器。

首先,在开发 MVC 应用程序时,请使用 Visual Studio 附带的 ASP.NET 开发 Web 服务器。 默认情况下,ASP.NET 开发 Web 服务器在当前 Windows 帐户的上下文中执行所有页面, (用于登录 Windows) 的任何帐户。

ASP.NET 开发 Web 服务器还支持 NTLM 身份验证。 可以通过右键单击解决方案资源管理器窗口中的项目名称并选择“属性”来启用 NTLM 身份验证。 接下来,选择“Web”选项卡并检查 NTLM 复选框, (请参阅图 1) 。

图 1 - 为 ASP.NET Development Web 服务器启用 NTLM 身份验证

clip_image002

对于生产 Web 应用程序,一手使用 IIS 作为 Web 服务器。 IIS 支持多种类型的身份验证,包括:

  • 基本身份验证 - 定义为 HTTP 1.0 协议的一部分。 通过 Internet 以明文形式发送用户名和密码 (Base64 编码) 。 - 摘要式身份验证 - 通过 Internet 发送密码的哈希,而不是密码本身。 - 集成的 Windows (NTLM) 身份验证 - 使用 Windows 在 Intranet 环境中使用的最佳身份验证类型。 - 证书身份验证 – 使用客户端证书启用身份验证。 证书映射到 Windows 用户帐户。

注意

有关这些不同类型的身份验证的更详细概述,请参阅 https://msdn.microsoft.com/library/aa292114(VS.71).aspx

可以使用 Internet Information Services Manager 启用特定类型的身份验证。 请注意,并非所有类型的身份验证都可用于每个操作系统。 此外,如果将 IIS 7.0 与 Windows Vista 配合使用,则需要启用不同类型的Windows 身份验证,然后它们才会显示在 Internet 信息服务管理器中。 打开“控制面板、程序、程序和功能”,打开或关闭 Windows 功能,然后展开“Internet Information Services”节点 (请参阅图 2) 。

图 2 - 启用 Windows IIS 功能

clip_image004

使用 Internet Information Services,可以启用或禁用不同类型的身份验证。 例如,图 3 说明了在使用 IIS 7.0 时禁用匿名身份验证和启用集成 Windows (NTLM) 身份验证。

图 3 - 启用集成 Windows 身份验证

clip_image006

授权 Windows 用户和组

启用Windows 身份验证后,可以使用 [Authorize] 属性来控制对控制器或控制器操作的访问。 此属性可应用于整个 MVC 控制器或特定控制器操作。

例如,清单 1 中的主控制器公开了三个操作,这些操作名为 Index () 、CompanySecrets () 和 StephenSecrets () 。 任何人都可以调用 Index () 操作。 但是,只有 Windows 本地管理器组的成员才能调用 CompanySecrets () 操作。 最后,只有 Redmond 域) 中名为 Stephen (的 Windows 域用户才能调用 StephenSecrets () 操作。

列表 1 – Controllers\HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [Authorize(Roles = "Managers")]
        public ActionResult CompanySecrets()
        {
            return View();
        }

        [Authorize(Users="redmond\\swalther")]
        public ActionResult StephenSecrets()
        {
            return View();
        }



    }
}

注意

由于 Windows 用户帐户控制 (UAC) ,使用 Windows Vista 或 Windows Server 2008 时,本地管理员组的行为将不同于其他组。 [Authorize] 属性无法正确识别本地 Administrators 组的成员,除非修改计算机的 UAC 设置。

尝试在没有适当权限的情况下调用控制器操作时会发生什么情况取决于启用的身份验证类型。 默认情况下,使用 ASP.NET Development Server 时,只会获得一个空白页。 该页面提供 “401 未授权 HTTP 响应状态”。

另一方面,如果使用 IIS 且禁用了匿名身份验证并启用了基本身份验证,则每次请求受保护的页面时,都会收到登录对话框提示 (请参阅图 4) 。

图 4 - 基本身份验证登录对话框

clip_image008

总结

本教程介绍如何在 ASP.NET MVC 应用程序的上下文中使用 Windows 身份验证。 你了解了如何在应用程序的 Web 配置文件中启用Windows 身份验证,以及如何使用 IIS 配置身份验证。 最后,你了解了如何使用 [Authorize] 属性将控制器操作的访问限制为特定的 Windows 用户或组。