ASP.NET MVC 应用程序的自定义 401 错误页面

2023-12-22

我创建了一个使用集成 Windows 身份验证的 ASP.NET MVC 应用程序。实现了以下授权逻辑:

  1. 尝试通过 NTLM 从 Active Directory 获取帐户凭据。

    • 如果收到凭据并且 Windows 帐户具有所需的权限,则执行请求的操作。
    • 否则转到第 2 条。
  2. Display the Windows authentication dialog, so a user can provide another credentials: Authentication Dialog

    • 如果收到另一个凭据并且用户具有所需的权限,则执行请求的操作。
    • 如果未收到其他凭据或帐户权限低于所需权限,则重复第 2 条。
    • 如果身份验证对话框被取消,则显示 401 错误消息。

然后我为应用程序添加了自定义错误页面,使用VictorySaber的解决方案 https://stackoverflow.com/a/9026907/7914637:

protected void Application_EndRequest()
{
    int status = Response.StatusCode;
    string actionName;
    if (status >= 400 && status < 500)
    {
        switch (status)
        {
            case 401:
                actionName = "Unauthorized";
                break;

            // Handle another client errors

            default:
                actionName = "BadRequest";
                break;
            }
        }
    else if (status >= 500 && status < 600)
    {
        switch (status)
        {
            case 501:
                actionName  = "NotImplemented";
                break;

            // Handle another server errors

            default:
                actionName  = "InternalServerError";
                break;
        }
    }
    if (!String.IsNullOrEmpty(actionName))
    {
        Response.Clear();
        var rd = new RouteData();
        rd.Values["controller"] = "Errors";
        rd.Values["action"] = actionName;
        IController c = new ErrorsController();
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
    }
}

结果,我的友好错误页面被呈现。但 Windows 身份验证对话框不会出现。如果出现 401 HTTP 状态代码,它会立即显示 401 错误消息。技巧与<httpErrors>的部分网络配置文件给出相同的结果。

另外,我发现proposal https://stackoverflow.com/questions/4085269/handle-windows-authentication-login-popups-cancel-click抓住401.2取消对话框时应出现的 HTTP 状态代码。但就我而言,该代码从未出现。

如何使用用户友好的错误页面而不是默认消息,但不更改身份验证对话框逻辑?

我需要实现以下要求:

  1. Windows 身份验证对话框仅针对其 AD 帐户没有所需权限的用户显示,以允许用户提供其他凭据。
  2. 如果未提供正确的凭据或用户未取消该对话框,则会出现该对话框。
  3. 仅当用户取消对话框时才会显示自定义 401 错误页面。

默认情况下,只有在以下情况下,服务器才会保持响应不变:SetStatus标志已设置。因此,有必要明确指定当 HTTP 状态代码为错误时 IS 必须对现有响应执行什么操作。

一种方法是配置<httpErrors> https://learn.microsoft.com/en-us/iis/configuration/system.webserver/httperrors/的元素<system.webServer>部分中的网页配置文件。刚刚设置existingResponse属性值到PassThrough,以便服务器在现有响应存在时保持响应不变。

<system.webServer>

  <!-- configuration settings -->

  <httpErrors errorMode="Custom" existingResponse="PassThrough" />
</system.webServer>

如果服务器提示输入 Windows 用户帐户凭据,配置会阻止错误页面呈现。这 对话取消后,响应将替换为错误页面。

通过禁用 IIS 自定义错误可以实现相同的结果TrySkipIisCustomErrors https://learn.microsoft.com/en-us/dotnet/api/system.web.httpresponse.tryskipiiscustomerrors?view=netframework-4.7.2的财产HttpResponse。所以 将以下行添加到问题的代码中可以解决问题:

Context.Response.TrySkipIisCustomErrors = true;

Note. 由于某种原因,第二种方法在我的生产服务器上不起作用。我认为,它需要额外的服务器设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 应用程序的自定义 401 错误页面 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 向下滚动时隐藏 div [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我只想在向下滚动时隐藏图像并显示另一张图像 当滚动到页面顶部时 需要显示第一个图像 需要隐藏其他图像 我尝试使用这段代码 This is t
  • IBM MQ 消息监听器

    您好 有谁知道如何使用 IBM MQ 创建消息监听器 我知道如何使用 JMS 规范来做到这一点 但我不确定如何为 IBM MQ 做到这一点 非常感谢任何链接或指针 虽然前面的响应者指出有一个 WMQ Java API 但 WMQ 也支持 J
  • 如何在 symfony2 服务中执行 $this->render() ?

    我在普通的 symfony2 控制器中有这段代码 temp this gt render BizTVArchiveBundle ContentTemplate content i template view html twig array
  • Postgres 中的递归查询和求和

    我必须在数据库中存储很多项目 每个项目都可以有子项目 该结构看起来像一棵树 Project ProjectChild1 ProjectChild2 ProjectChild n ProjectChildOfChild1 ProjectChi
  • 谷歌地图错误:InvalidKeyOrUnauthorizedURLMapError

    我正在用 JavaScript HTML CSS 开发一个使用 Google 地图的应用程序 我收到以下警报对话框 此页面无法显示 Google 地图元素 提供的 Google API 密钥无效或该网站无权使用它 错误代码 InvalidK
  • 滚动视图内的粘性组件

    我正在尝试构建一个像这个应用程序一样的粘性组件 http www screencapture ru file E88F08Fc http www screencapture ru file E88F08Fc 交易 产品 事件选项卡 segm
  • 尝试使用 powershell 从网络链接下载 zip 文件

    好的 我正在尝试从我们与 powershell 一起使用的 Web 链接下载文件 我正在下载一个 zip 文件 其中名称的开头始终相同 但中间部分会根据 zip 的版本号而变化 当我使用完全限定的网址并将文件名硬编码到脚本中时 我就能够下载
  • 网站图标必须为 32×32 或 16×16 吗?

    我想使用单个图像作为常规图标和 iPhone iPad 友好图标 这可能吗 如果作为常规浏览器图标链接 iPad 友好的 72 72 PNG 会缩放吗 或者我是否必须使用单独的 16 16 或 32 32 图像 2020 年更新 坚持 16
  • Chart.js:仅在 x 轴上显示数据点的标签

    I m making a chart by using Chart js and have a problem regarding the x axis of my line chart I have made a multi line c
  • 有办法创建这个流序列吗?

    我正在尝试实现这个弹珠图 其假设是有 N 个 sN 并且我将此流添加到 main 中 s1 1 99 gt s2 3 7 gt main 1 1 3 1 7 99 7 gt 现在我有一个近似值 但是有 重复 const main new R
  • 切换到 Xcode 6 Beta 5 后所有 IBOutlet 都变为 nil

    例如 视图控制器中有一个属性 IBOutlet weak var nameLabel UILabel 此属性是nil inside viewWillAppear and viewDidLoad 因此应用程序在运行时崩溃 它在 Xcode 6
  • 使用 psycopg2 执行 SQL 查询

    我正在尝试使用 psycopg2 将列表传递到 postgres 表中 我不断遇到异常 File c Python27 Projects Newsletter newsletter py line 148 in
  • 正则表达式不允许电子邮件中的任何位置出现空格

    我正在尝试使用正则表达式验证电子邮件地址 这样如果在电子邮件中的任何位置添加空格 它就会引发错误 我当前使用的正则表达式是这样的
  • Mac 上的 ActionScript 开发

    我知道适用于 Windows 的 FlashDevelop 但是在 Mac 上开发 ActionScript 或 haxe 怎么样 除了 eclipse flex builder 和 FDT 的 Flex 插件之外 还有什么好的 IDE 可
  • 我如何在 dhall 中表示一个元组?

    我想在 dhall 中表示 IPv4 地址 这样我就可以管理我的主机配置 默认情况下 它保存为文本 但这显然不能令人满意 因为它允许任何旧文本被漏掉 我想将这些值保留为 8 位值的 4 元组 我认为 Dhall 本身不允许这样做 我能看到的
  • 使用假设生成具有自定义值限制的列表列表

    故事 目前 我有一个正在测试的功能 需要整数列表的列表遵循以下规则 子列表的数量 我们称之为N 可以是 1 到 50 子列表内的值的数量对于所有子列表 矩形形式 都是相同的 并且应该 gt 0 且 子列表内的值不能大于或等于子列表的总数 换
  • 使用 ColdFusion 重现这种类似 printf 的格式的最直接方法是什么?

    我因为一项非常简单的任务而被投入 ColdFusion 该应用程序有一些显示 帮助代码 的逻辑 我们不讨论什么是帮助代码 但是 该逻辑有问题 需要修复 给定一个两个字母的代码 一个 1 4 位数字和另一个 1 2 位数字 我需要像这样显示它
  • MongoDB 查询聚合函数返回空结果

    以下是我编写的用于根据事件名称获取计数的查询 data DB collection Events collection gt raw function collection return collection gt aggregate ma
  • 如何使匹配器忽略变音符号 - JQUERY

    我正在尝试让 Typeahead 能够处理重音 到目前为止 还没有雪茄 文件 typeahead json 包含如下数据 0 Jo o 1 Rog rio 2 F bio JQuery 代码如下所示 getJSON banco typeah
  • ASP.NET MVC 应用程序的自定义 401 错误页面

    我创建了一个使用集成 Windows 身份验证的 ASP NET MVC 应用程序 实现了以下授权逻辑 尝试通过 NTLM 从 Active Directory 获取帐户凭据 如果收到凭据并且 Windows 帐户具有所需的权限 则执行请求