在 Katana 中启用 Windows 身份验证

本文介绍如何在 Katana 中启用 Windows 身份验证。 它涵盖两种方案:使用 IIS 托管 Katana,以及使用 HttpListener 在自定义进程中自托管 Katana。 感谢巴里·多兰斯、大卫·马特森和克里斯·罗斯查看本文。

Katana 是 Microsoft 实现 的 OWIN,即适用于 .NET 的开放 Web 接口。 可 在此处阅读 OWIN 和 Katana 简介。 OWIN 体系结构具有多个层:

  • 主机:管理运行 OWIN 管道的过程。
  • 服务器:打开网络套接字并侦听请求。
  • 中间件:处理 HTTP 请求和响应。

Katana 目前提供两个服务器,这两个服务器都支持 Windows 集成身份验证:

  • Microsoft.Owin.Host.SystemWeb。 将 IIS 用于 ASP.NET 管道。
  • Microsoft.Owin.Host.HttpListener。 使用 System.Net.HttpListener。 自承载 Katana 时,此服务器当前是默认选项。

注意

Katana 目前不提供用于 Windows 身份验证的 OWIN 中间件,因为此功能已在服务器中提供。

IIS 中的 Windows 身份验证

使用 Microsoft.Owin.Host.SystemWeb,只需在 IIS 中启用 Windows 身份验证即可。

首先,使用“ASP.NET 空 Web 应用程序”项目模板创建新的 ASP.NET 应用程序。

示例插图

接下来,添加 NuGet 包。 在 “工具 ”菜单中,选择“ NuGet 包管理器”,然后选择“ 包管理器控制台”。 在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.Owin.Host.SystemWeb -pre

现在,使用以下代码添加名为 的 Startup 类:

using Owin;

namespace KatanaWebHost
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

这就是为在 IIS 上运行的 OWIN 创建“Hello world”应用程序所需的全部内容。 按 F5 调试该应用程序。 应在浏览器窗口中看到“Hello World!”。

插图示例

接下来,我们将在 IIS Express 中启用 Windows 身份验证。 在“ 视图 ”菜单中,选择“ 属性”。 单击解决方案资源管理器中的项目名称以查看项目属性。

“属性” 窗口中,将 “匿名身份验证 ”设置为 “已禁用 ”,并将 “Windows 身份验证 ”设置为 “已启用”。

启用身份验证,说明示例

从 Visual Studio 运行应用程序时,IIS Express将需要用户的 Windows 凭据。 可以使用 Fiddler 或其他 HTTP 调试工具查看此内容。 下面是 HTTP 响应示例:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Sun, 28 Jul 2013 07:28:51 GMT
Content-Length: 6062
Proxy-Support: Session-Based-Authentication

此响应中的WWW-Authenticate标头指示服务器支持使用 Kerberos 或 NTLM 的 Negotiate 协议。

稍后,将应用程序部署到服务器时, 请按照以下步骤 在该服务器上启用 IIS 中的 Windows 身份验证。

HttpListener 中的 Windows 身份验证

如果使用 Microsoft.Owin.Host.HttpListener 自承载 Katana,则可以直接在 HttpListener 实例上启用 Windows 身份验证。

首先,创建新的控制台应用程序。 接下来,添加 NuGet 包。 在 “工具 ”菜单中,选择“ NuGet 包管理器”,然后选择“ 包管理器控制台”。 在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.Owin.SelfHost -Pre

现在,使用以下代码添加名为 的 Startup 类:

using Owin;
using System.Net;

namespace KatanaSelfHost
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpListener listener = 
                (HttpListener)app.Properties["System.Net.HttpListener"];
            listener.AuthenticationSchemes = 
                AuthenticationSchemes.IntegratedWindowsAuthentication;

            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

此类实现与之前相同的“Hello world”示例,但它也将 Windows 身份验证设置为身份验证方案。

在 函数中 Main ,启动 OWIN 管道:

using Microsoft.Owin.Hosting;
using System;

namespace KatanaSelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using (WebApp.Start<Startup>("http://localhost:9000"))
            {
                Console.WriteLine("Press Enter to quit.");
                Console.ReadKey();
            }        
        }
    }
}

可以在 Fiddler 中发送请求,以确认应用程序使用的是 Windows 身份验证:

HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Sun, 28 Jul 2013 21:02:21 GMT
Proxy-Support: Session-Based-Authentication

项目 Katana 概述

System.Net.HttpListener

了解 MVC 5 中的 OWIN 表单身份验证