在单个操作(而不是整个应用程序)上使用 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 在我的服务器上托管应用程序。
答案基于这篇 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 将凭据与请求一起传递?