2016-07-15 67 views
0

我想在单个控制器动作而不是全局应用程序中使用Windows集成身份验证。我已经在网上阅读了很多文章和StackOverflow,但还没有找到答案。 请注意,我正在开发Web API 2.0而不是MVC。身份验证使用Windows身份验证上一个动作,而不是整个应用程序

也就是说,通常在您的整个应用程序启用Windows身份验证,你会做这样的事情Web API documentation describes

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

在幕后,我不知道这是什么一样准确,但我有怀疑我可能能够通过执行IAuthenticationFilter作为described by Web API documentation在单个控制器动作上复制它。但是,我还没有找到确切的文章解释如何做到这一点的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 to host这个应用程序。

+0

你的意思认证或授权?恕我直言。您**在应用程序级验证**并**授权**每种方法。 –

+0

Gotcha。听起来好像你描述的是真的,那么我所追求的是不可能的。我希望认证和不授权。 –

回答

1

答案基于此MSDN article覆盖HttpClient的认证计算器后。

本质上讲,你可以定义指定哪个请求使用集成Windows身份验证来验证一个自定义的委托方法。

在下面的代码builder指OWIN自托管的“启动”代码中使用的IAppBuilder实例。有关此相关主题的更多详细信息,请参阅OWIN self-host article

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; 
} 
-2

你见过以下帖子吗? http://www.scip.be/index.php?Page=ArticlesNET38。这似乎是相当一步一步。你没有提到你是否已经部署了这个,或者在通过Visual Studio运行的IIS Express中有这个功能,但是突出给我的一个部分是在IIS配置中的“我的文档\ IISExpress \ config

它出现这种解决方案
<windowsAuthentication enabled="true"> 

注意只涵盖你的问题的基于浏览器的部分。对于基于非浏览器的部分,我假设你将不得不让应用程序收到401响应。

看起来已经有使用本地Windows凭据

How to get HttpClient to pass credentials along with the request?

+0

我不明白这是如何解决要求在单个API上进行验证的问题,而不是整个应用程序。 –

+0

你一定不知道web api那么好。您使用[authorize]属性修饰控制器操作。其他不需要授权的行为应该广泛开放。 – Bill

+0

不幸的是,你提出的解决方案要求每个服务请求都有一个授权头;否则,未经授权的回复将被返回给客户端。我的目标是只验证问题中所述的单个控制器操作的授权标头。谢谢。 –

相关问题