在具有Kerberos的Web服务器上,客户端将匿名发送请求,并返回401状态。然后它再次使用身份验证发送相同的请求,现在返回200状态。是否可以在MVC / JavaScript / etc中设置一个Web应用程序,以便知道匿名请求是徒劳的,并且可以直接进行用户身份验证请求?对于特定情况,我使用的是jQuery和AJAX,它们以很短的间隔从服务器中提取数据。
更新:我希望客户端知道发送匿名请求没有用,所以它也可以在第一次发送带有用户名的请求。为什么在你绝对知道你只能获得401回复时首先发送一个匿名请求?
答案 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);
}