如何在ASP.NET页面中编程生成401错误

37

您可以看到,这是一个非 Web 开发人员的问题。我想要一个 ASPX 页面,在某些情况下,可以从代码生成 401 错误。理想情况下,它应该显示 IIS 的标准页面。

5个回答

61
Response.StatusCode = 401;
Response.End();

8
我不知道为什么这篇回答会被投票否决——它的本质与我(得到赞同的)答案几乎相同,只是以代码形式呈现。当然,它没有可能有用的链接,但它仍然是一个完全好的回答…… - Jon Skeet
我完全同意Jon的观点。由于我不能接受两个答案,所以我接受了Jon的答案并投了这一个赞。尽管有一些事情我还需要自己弄清楚,但这给了我一个良好的开端。谢谢! - Detlef D. Doerscheln
3
这个答案可能被投票否决了,因为它是在 @jon 的回答之后提交的,看起来像是抓住热度的回复(虽然它们都是同时编写的)。不过,还是感谢您的点赞 :) - Mark Cidade
1
Jon的方法和这个方法的问题在于,表单身份验证会看到有人试图返回401,拦截它,并将其重写为302。因此,用户代理程序呈现的不是401,而是302 Found - Ian Boyd

59

44

我认为我仍然更喜欢:

throw new HttpException(401, "Auth Failed")

我认为Response.StatusCode方法不会触发在web.config文件中定义的自定义错误,例如:

<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
     <error statusCode="401" redirect="AuthFailed.htm" />
     <error statusCode="403" redirect="NoAccess.htm" />
     <error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>

抛出新异常肯定会触发自定义错误。

此外,您可能正在使用应用程序范围的错误日志记录工具,例如 ELMAH 或其他工具,我认为 Response.StatusCode 方法也不会在那里记录。

注意:现在我看到问题说,理想情况下应该显示标准的 IIS 错误页面。显然,不需要自定义错误页面。在这种情况下,我会使用 Response.StatusCode 方法。


太棒了!这正是我需要知道的! - Richard Barker

12

根据MSDN的说明,您应该能够直接使用以下内容。

Throw New HttpException(401, "Auth Failed")

编辑 在看到其他回答后,设置状态码可能更合适。


3
我尝试了这个方法,但当我在浏览器中检查HTTP响应时,我得到了500(内部服务器错误)而不是401(未经授权)。 - dreamerkumar
另外,抛出异常在性能方面不是更糟糕吗? - dreamerkumar
我真的不在乎什么更受欢迎。这种方法更短,更容易记忆,所以我使用它。 - Brad

10

补充一点。

如果页面的任何部分已经被写入输出缓冲区,则清除任何缓冲内容非常重要,否则页面可能不会正确显示。

在模板环境中,这种情况很有可能发生。例如主页面...

Response.ClearContent();
Response.StatusCode = 401;
Response.End();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接