在单个操作(而不是整个应用程序)上使用 Windows 身份验证进行身份验证

本文关键字:身份验证 Windows 应用程序 操作 单个 | 更新日期: 2023-09-27 17:57:04

我想在单个控制器操作而不是全局应用程序上使用 Windows 集成身份验证进行身份验证。我在网上和StackOverflow上看过很多文章,但还没有找到答案。请注意,我使用的是Web API 2.0而不是MVC。

也就是说,通常要在整个应用程序上启用 Windows 身份验证,您需要执行类似于 Web API 文档描述的操作:

<system.web>
    <authentication mode="Windows" />
</system.web>

在幕后,我不确定这到底做了什么,但我怀疑我可以通过实现 IAuthenticationFilter 在单个控制器操作上复制它,如 Web API 文档所述。但是,我还没有找到一篇结论性的文章来解释如何对 Windows 集成身份验证执行此操作。

我的目标示例:

归根结底,我希望我的单个 Web API 接受来自配置为在以下任一客户端方案中使用 Windows 身份验证的客户端的请求:

C#

var handler = new HttpClientHandler()
{
    UseDefaultCredentials = true
};
var client = new HttpClient(handler);

浏览器

$.ajax({
    url: 'api/testauthentication',
    type: 'GET',
    dataType: 'json',
    xhrFields: {
        withCredentials: true
    }
})

编辑 #1

我注意到,值得注意的是

,我想以编程方式完成上述工作,而不是通过配置文件(如 web.config、IIS 设置等)。此外,我正在使用 OWIN 在我的服务器上托管应用程序。

在单个操作(而不是整个应用程序)上使用 Windows 身份验证进行身份验证

答案基于这篇 MSDN 文章。

实质上,您可以定义一个自定义委托方法,该方法指定使用集成 Windows 身份验证对哪些请求进行身份验证。

以下代码中的builder是指 OWIN 自托管的"启动"代码中使用的 IAppBuilder 实例。有关此相关主题的更多详细信息,请参阅 OWIN 自托管文章。

OwinHttpListener httpListener = (OwinHttpListener)builder.Properties[typeof(OwinHttpListener).FullName];
httpListener.Listener.AuthenticationSchemeSelectorDelegate = new AuthenticationSchemeSelector(DetermineAuthenticationScheme);

然后定义类似于以下内容DetermineAuthenticationScheme委托方法:

AuthenticationSchemes DetermineAuthenticationScheme( HttpListenerRequest request )
{
    if ( request == null )
    {
        throw new ArgumentNullException( "request" );
    }
    if ( request.RawUrl.IndexOf( "v1/foo", StringComparison.OrdinalIgnoreCase ) >= 0 )
    {
        return AuthenticationSchemes.IntegratedWindowsAuthentication;
    }
    return AuthenticationSchemes.Anonymous;
}

你看过下面的帖子吗? http://www.scip.be/index.php?页面=文章NET38。它似乎是相当循序渐进的。你没有提到你是否已经部署了这个,或者通过Visual Studio在IIS Express中运行了这个,但让我印象深刻的部分是"我的文档''IISExpress''config"中IIS配置中所需的设置更改

  <windowsAuthentication enabled="true">

请注意,此解决方案似乎仅涵盖问题中基于浏览器的部分。 对于非基于浏览器的部分,我假设您必须让应用程序接收 401 响应。

看起来已经有一个堆栈溢出帖子涵盖了使用本地窗口凭据的 HttpClient 身份验证

如何让 HttpClient 将凭据与请求一起传递?