2009-05-04 88 views
0

症状:
某些用户无法成功进行POST,大多数可以成功POST。
发生错误时,用户将被重定向到该站点的共享/错误页面。使用疑难解答身份验证错误

技术:
IIS V6
Windows Server 2003的
asp.net V3.5
asp.net mvc框架V1.0
jQuery的
LINQ
SQL Server 2005中

认证:Windows与AspNetActiveDirectoryMembershipProvider
这是web.config的一个片段:

<authentication mode="Windows"/> 
    <membership defaultProvider="AspNetActiveDirectoryMembershipProvider"> 
    <providers> 
      <add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider,&#xA;     System.Web, Version=2.0.3600.0, Culture=neutral,&#xA;     PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnString" connectionUsername="" connectionPassword=""/> 
     </providers> 
    </membership> 

下面是揭开序幕保存视图的链接
<a href="javascript:void(document.frmCurrentLineItems.submit())" title="Saves this month only">Save This Month</a>

下面是一些基于jQuery的JavaScript代码:

$("form#frmCurrentLineItems").submit(function() { 
    submitView(this); 
    return false; 
}); 

function submitView(form) {   
    $.ajax(
      { 
       type: form.method, 
       url: form.action, 
       data: $(form).serialize(), 
       dataType: "html", 
       error: function(error) { 
        alert(error); 
       } 
      } 
     ); 
} 

这里的控制方法的一部分:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CurrentLineItems(FormCollection thisForm) 
    // Get the forecast from the session 
    BusinessLogic.ForecastBL thisForecast = (BusinessLogic.ForecastBL)HttpContext.Session["ForecastMetaData"]; 

     if (thisForecast != null) 
     { 
      // Run the save to db stuff here 
      return View("CurrentLineItems", ViewData["LineItemSummary"]); 
     } 
     else 
     { 
      return Redirect("../Shared/Error"); 
     } 

注意上面的代码abt ...我很确定,拉会话中的预测对象不会导致错误,至少我假设它不是因为会话已过期,因为无法保存的用户在打开页面后无法保存,然后立即尝试保存。

类还具有以下属性:

[HandleError] 
[Authorize] 
public class ForecastController : Controller 
{ 

该网站,在IIS中属性,在身份验证方法:
启用匿名访问泛滥,集成Windows身份验证检查。

下面就一起来看看IIS日志从遇到此问题的用户身份:

466 2009-04-28十六时41分15秒W3SVC1100645706 192.168.10.22 POST /预测/ CurrentLineItems - 443 - XX.XX .XX.XX Mozilla/4.0 +(compatible; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; +。NET + CLR + 1.1.4322)401 1 0
467 2009-04-28 16:41 :15 W3SVC1100645706 192.168.10.22 POST/Forecast/CurrentLineItems - 443 DOMAIN \ username XX.XX.XX.XX Mozilla/4.0 +(compatible; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; + .NET + CLR +1.1.4322)302 0 0
468 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 GET/Shared/Error - 443 - XX.XX.XX.XX Mozilla/4.0 +(compatible; + MSIE + 7.0 +的Windows NT + 5.1 + + GTB5; + NET + CLR + 1.1.4322 )401 1 0
469 2009-04-28 16:41:16 W3SVC1100645706 192.168.10.22 GET/Shared/Error - 443 DOMAIN \ username XX.XX.XX.XX Mozilla/4.0 +(compatible; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; +。NET + CLR + 1.1.4322)404 0 0

下面是那些相同的行剥离,希望更好的可读性:
2009-04-28 16:41:15 POST/Forecast/CurrentLineItems - 443 - XX.XX.XX.XX 401 1 0
2009-04-28 16:41:15 POST/Forecast/CurrentLineItems - 443 DOMAIN \ username XX.XX.XX.XX 302 2009-04-28 16:41:15 GET/Shared/Error - 443 - XX.XX.XX.XX 401 1 0
2009-04-28 16:41:16 GET/Shared/Error - 443 DOMAIN \用户名XX.XX.XX.XX 404 0 0

只注意到所有的POST请求看起来像上面......除了成功的一个的第二POST返回一个200 ......

那么如何我确定是什么导致上面的第一个POST ...没有DOMAIN \用户名信息并获得401错误的网络服务器?

又是为什么302错误?

好像我要求两个POSTS ...但我不太明白为什么浏览器发送两个POST请求? (当然...我怀疑我的代码,但不能完全弄清楚为什么。)

任何疑难解答方法,以帮助追查上述错误,将不胜感激。

正在采取看看现在Troubleshooting HTTP 401 errors in IIS编辑....这并没有真正的帮助瓦特/我的问题

回答

0

更改链接到一个输入按钮/元素似乎已经解决了这个问题...
<input type="submit" value="Save This Month" title="Saves this month only" class="submitBtn"/>

由于输入键是我要提交表单里面......它击中后控制器动作并保存数据,然后显示视图...

2

你又回到第一个401是NTLM身份验证方案的一部分,这是多么IIS处理Windows身份验证。发出请求,它返回401,因此它会再次尝试传递NTLM身份验证信息。

因此,您的第一篇文章进来,得到一个401,然后重新验证,并得到一个302.这是您的重定向到您的错误页面。然后你的错误页面得到一个401,再次尝试,并得到一个404.

所以你有两个问题,第一个是你的控制器中的某种类型的错误。它可能是空检查重定向或它可能是另一个错误,你记录你的错误?此外,我会抛出一个异常,而不是重定向..然后,你的handleError逻辑应该踢你并处理它。

其次,它看起来像你的错误页面不存在或你的路由搞砸了。

+0

詹姆斯,感谢您花时间回答。我似乎已经通过将上面的链接更改为具有提交类型的输入按钮来解决错误... ...再次感谢 – w4ik 2009-05-13 13:28:52