解决身份验证错误

时间:2009-05-04 19:14:38

标签: jquery asp.net-mvc authentication

症状:
有些用户无法成功发帖,大多数都可以成功发帖 发生错误时,用户将被重定向到站点的“共享/错误”页面。

使用的技术:
IIS v6
Windows Server 2003
asp.net v3.5
asp.net mvc framework v1.0
jQuery的
LINQ
sql server 2005

身份验证:带有AspNetActiveDirectoryMembershipProvider的Windows 这是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");
        }

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

该类还具有以下属性:

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

该站点在IIS属性中具有身份验证方法:
启用匿名访问并选中“集成Windows身份验证”。

以下是遇到此问题的用户的IIS日志:

466 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 POST / Forecast / CurrentLineItems - 443 - XX.XX.XX.XX Mozilla / 4.0 +(兼容; + 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 +(兼容; + 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 /共享/错误 - 443 - XX.XX.XX.XX Mozilla / 4.0 +(兼容; + 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 +(兼容; + 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 \ username XX.XX.XX.XX 404 0 0

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

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

为什么302错误?

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

任何有助于追踪上述错误的故障排除方法都将受到赞赏。

我现在看看Troubleshooting HTTP 401 errors in IIS编辑......这对我的问题没什么帮助

2 个答案:

答案 0 :(得分:2)

您回来的第一个401是NTLM身份验证方案的一部分,它是IIS处理Windows身份验证的方式。发出请求,它返回401,因此它再次尝试传递NTLM身份验证信息。

所以你的第一篇文章进来了,得到一个401,然后用身份验证重试并获得302.这是你重定向到你的错误页面。然后您的错误页面获得401,再次尝试并获得404.

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

第二种情况是,您的错误页面看起来不存在或您的路由混乱了。

答案 1 :(得分:0)

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

由于输入按钮位于我想提交的表单内...它会点击Post控制器操作并保存数据然后显示视图......