Asp.net mvc 是否可以跳过对Web服务器的第一个匿名请求?
在具有Kerberos的Web服务器上,客户端将匿名发送请求,并返回401状态。然后它再次发送相同的请求,并进行身份验证,现在返回200状态。在MVC/JavaScript/etc中设置一个web应用程序是否可能知道匿名请求是无效的,并直接请求用户身份验证?对于一个特定的例子,我使用jQuery和AJAX,它们以很短的时间间隔从服务器中提取数据 更新:我想让客户端知道发送匿名请求是没有用的,所以它可以在第一次发送带有用户名的请求。既然你完全知道你只会得到401,为什么要首先发送匿名请求呢?根据答案,你应该在发送回调之前使用Asp.net mvc 是否可以跳过对Web服务器的第一个匿名请求?,asp.net-mvc,iis,kerberos,Asp.net Mvc,Iis,Kerberos,在具有Kerberos的Web服务器上,客户端将匿名发送请求,并返回401状态。然后它再次发送相同的请求,并进行身份验证,现在返回200状态。在MVC/JavaScript/etc中设置一个web应用程序是否可能知道匿名请求是无效的,并直接请求用户身份验证?对于一个特定的例子,我使用jQuery和AJAX,它们以很短的时间间隔从服务器中提取数据 更新:我想让客户端知道发送匿名请求是没有用的,所以它可以在第一次发送带有用户名的请求。既然你完全知道你只会得到401,为什么要首先发送匿名请求呢?根据答
,然后自己添加授权
头。更新,因为你不需要允许匿名访问。
您可以删除默认的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>
您正在寻找抢占式身份验证,这是。除非服务器向您提出质疑,否则不要发送凭据,否则您可能会向未知服务器泄露机密。我不太明白-您想首先设置服务器以指示客户端发送身份验证请求吗?您是否使用默认[授权]属性?如何创建<代码> Cu饰属性:AuthigeAtgult允许匿名属性> /代码>。请参阅上面的更新。另外,我不希望匿名访问服务器。我希望客户端知道发送匿名请求是没有用的,因此,它也可以在第一次发送带有用户名的请求。
没有任何请求时,客户端如何知道这件事?这不会满足OP的要求。我使用自定义IHttpModulePreRequestHandlerExecute
事件来检查传入的请求访问令牌,然后,标头和Cookie决定是重定向匿名访问还是响应ajax请求的自定义JSON消息。我相信MVC引擎会在客户端有cookie的情况下自动做到这一点。然而,很明显,客户缺少一个是很奇怪的。但这是在vpn上,不应该成为问题。如果您的客户端是浏览器,祝您好运。他们可能不会支持,就是这样。你知道如何使用pass-through/windows身份验证而不是Basic来设置它吗?
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);
}