是否可以跳过对Web服务器的第一个匿名请求?

时间:2013-11-21 08:16:49

标签: asp.net-mvc iis kerberos

在具有Kerberos的Web服务器上,客户端将匿名发送请求,并返回401状态。然后它再次使用身份验证发送相同的请求,现在返回200状态。是否可以在MVC / JavaScript / etc中设置一个Web应用程序,以便知道匿名请求是徒劳的,并且可以直接进行用户身份验证请求?对于特定情况,我使用的是jQuery和AJAX,它们以很短的间隔从服务器中提取数据。

更新:我希望客户端知道发送匿名请求没有用,所以它也可以在第一次发送带有用户名的请求。为什么在你绝对知道你只能获得401回复时首先发送一个匿名请求?

3 个答案:

答案 0 :(得分:1)

根据this回答,您应该使用beforeSend回调,然后自行添加Authorization标题。

答案 1 :(得分:1)

您正在寻找抢先身份验证,这是highly discouraged。除非服务器向您提出质疑,否则不要发送凭据,否则您可能会向未知服务器泄露秘密。

答案 2 :(得分:0)

更新,因为您不需要允许匿名访问。

您可以删除默认的IIS身份验证模块和/或为特定部分添加自己的自定义HttpModule

  <location path="PathToWebApi">
    <system.web>
      <httpModules>
        <!-- default IIS HttpModules  -->
        <remove name="WindowsAuthentication"/>
        <remove name="FormsAuthentication"/>
        <remove name="PassportAuthentication"/>
        <remove name="RoleManager"/>
        <remove name="UrlAuthorization"/>
        <remove name="FileAuthorization"/>
        <remove name="AnonymousIdentification"/>
        <remove name="Profile"/>
        <add name="CustomAuthentication" type="Your.NameSpace.CustomAuthentication"/>
      </httpModules>
    </system.web>
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="false">
        <add name="CustomAuthentication" type="Your.NameSpace.CustomAuthentication" preCondition="managedHandler"/>
      </modules>
  </location>

您可以实现检查传入请求上下文的CustomAuthentication : IHttpModule类,并根据您的自定义逻辑设置当前用户身份。

    public void Init(HttpApplication context)
    {
        //add event listener to authenticate Http request
        //context.AuthenticateRequest += new EventHandler(AuthenticateRequest); //Session is null at AuthenticateRequest state
        context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
    }