ASP.NET MVC 4 中 Windows 身份验证和表单身份验证的混合

2023-11-26

我们有一个 ASP.NET MVC 4 Intranet 应用程序。我们正在使用 Windows 身份验证,这方面工作正常。使用用户的凭据,我们可以从 Web 应用程序访问这些凭据。

然而,我们真正想要的是某种混合模式。我们希望从浏览器获取用户的凭据,但我们还想验证用户是否在我们应用程序的数据库中。如果用户在数据库中,那么他们可以继续。如果不是,我们希望将他们重定向到一个页面,要求提供备用凭据。我现在所做的是,在Global.asax.cs,我有一个Application_AuthenticateRequest方法,我正在检查用户是否经过身份验证。如果他们是,并且他们的 cookie 信息没有反映他们已登录系统的事实,那么我将他们登录并设置一些包含用户信息的 cookie。如果他们没有经过身份验证,我会将他们重定向到登录页面。由于涉及公司政策的原因,我们无法使用 AD 角色,因此我们需要使用数据库进行额外的身份验证。

我正在猜测Application_AuthenticateRequest不是这样做的地方,但也许是。但我们基本上需要一个地方来过滤身份验证请求。但此外,这种实现还导致我遇到另一个问题:

我们的应用程序中有某些允许匿名访问的 URL。我已经添加<location>为这些标记到 web.config。问题是,当匿名调用这些时,它会Application_AuthenticateRequest并尝试将用户登录到数据库中。现在,我可以将代码添加到Application_AuthenticateRequest处理这些 URL,这就是我目前的计划,但如果我要写Application_AuthenticateRequest不是做这件事的地方,那么我宁愿现在就解决,而不是以后再解决。


为此,您需要使用操作过滤器。您可以像这样扩展 AuthorizeAttribute:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    private UnitOfWork _unitOfWork = new UnitOfWork();

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = false;
        var username = httpContext.User.Identity.Name;
        // Some code to find the user in the database...
        var user = _unitOfWork.UserRepository.Find(username);
        if(user != null)
        {
           isAuthorized = true;
        }


        return isAuthorized;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {            
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (AuthorizeCore(filterContext.HttpContext))
        {
            SetCachePolicy(filterContext);
        }
        else
        {
           // If not authorized, redirect to the Login action 
           // of the Account controller... 
          filterContext.Result = new RedirectToRouteResult(
            new System.Web.Routing.RouteValueDictionary {
               {"controller", "Account"}, {"action", "Login"}
            }
          );               
        }
    }

    protected void SetCachePolicy(AuthorizationContext filterContext)
    {
        // ** IMPORTANT **
        // Since we're performing authorization at the action level, 
        // the authorization code runs after the output caching module. 
        // In the worst case this could allow an authorized user 
        // to cause the page to be cached, then an unauthorized user would later 
        // be served the cached page. We work around this by telling proxies not to 
        // cache the sensitive page, then we hook our custom authorization code into 
        // the caching mechanism so that we have the final say on whether a page 
        // should be served from the cache.
        HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
        cachePolicy.SetProxyMaxAge(new TimeSpan(0));
        cachePolicy.AddValidationCallback(CacheValidationHandler, null /* data */);
    }

    public void CacheValidationHandler(HttpContext context,
                                        object data,
                                        ref HttpValidationStatus validationStatus)
    {
        validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
    }
}

然后,您可以在控制器级别或操作级别使用此属性,如下所示:

[MyAuthorize]
public ActionResult SomeAction()
{
  // Code that is supposed to be accessed by authorized users only
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 4 中 Windows 身份验证和表单身份验证的混合 的相关文章

  • ASP.NET MVC FileResult 正在损坏文件

    我一直在尝试让我的 ASP NET MVC 网站将一些数据导出为 Excel 文件 几个小时以来 我一直以为 NPOI 只是在生产垃圾 所以我转向了 EPPlus 我在 LINQPad 中对其进行了测试 它创建了一个正常工作的 XLSX 文
  • IIS 上的 ASP.NET MVC3 和 Windows Auth 不断重定向到 /Account/Login

    我正在运行 MVC3 和 Windows 身份验证 Web 应用程序 当我部署到 IIS6 时 它运行得很好 直到我遇到需要身份验证的页面 然后 当我在应用程序中没有任何痕迹并且我的 web config 配置为 Windows 身份验证时
  • 错误:确保控制器具有无参数公共构造函数 webapi

    我正在使用 webapi unity 和 mvc 我收到错误 确保控制器具有无参数公共构造函数 我已经看到类似问题的解决方案 但仍然无法使其工作 我已经安装了 unity webapi 并且似乎拥有所有必要的参考 Microsoft Pra
  • 是否应该在使用 MVC 的每个视图中使用 ViewModel?

    我了解您使用 ViewModel 来存储来自其他模型和源的不同数据以在视图中使用 因为模型并不总是包含您想要的内容 我试图弄清楚为每个视图使用 ViewModel 是否合适 我问的原因是出于一致性原因 您可以有一个仅需要模型本身的视图 以及
  • 此资源不支持“multipart/form-data”

    我有 WEBAPI2 后端 我尝试从邮递员发送表单数据 但出现这个错误 没有 MediaTypeFormatter 可用于从媒体类型为 multipart form data 的内容中读取类型为 StartWorkingDay 的对象 这是
  • 选择另一个下拉列表时填充下拉列表[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 全局访问 Ninject 内核

    这个问题与 Ninject 没有具体关系 这更多的是一个一般性的编码问题 但我将其发布在这里 以防在 Ninject 中可能有更好的方法来完全处理该问题 而不是我正在尝试做的事情 我想知道是否可以从 Global asax 中的实例全局访问
  • 如何使用带有 Scripts.Render 的 ASP MVC 4 捆绑包的脚本延迟属性

    我浏览了 Google 和 Stackoverflow 但没有找到答案 是否有任何内置方法可以使捆绑包按延迟执行 或者有人知道有人为此编写的扩展帮助器方法吗 尝试将 Web Optimization 升级到版本 1 1 0Codeplex
  • 如何对我的 asp.net-mvc 控制器的 OnActionExecuting 方法进行单元测试?

    我已经重写了控制器的 OnActionExecuting 方法 以根据执行的 filterContext 设置一些内部状态 我该如何测试这个 该方法本身是受保护的 所以我假设我必须在调用堆栈中走得更高 我需要什么代码来测试这个 我正在使用
  • 在 SelectList 集合中设置所选项目

    我有一堂具有以下属性的课程 它构建了一个SelectList现有列表中的对象 然后设置所选项目 public SelectList ProviderTypeList get SelectList list new SelectList my
  • 使用 MVC 5 RouteArea 属性时找不到默认区域视图

    我有一个包含多个区域的 MVC5 项目 我有一个默认区域 名为Default 并在其中有一个默认控制器 名为DefaultController 这可以通过站点路径访问 RouteArea public class DefaultContro
  • asp.net mvc 中编辑器模板中复杂类型的 ModelMetadata

    我有一个视图模型 其中包含 TestThing 类型的复杂属性 该属性声明为 public class TestThing Display Name String3 Prompt String4 public string Test1 ge
  • 后退按钮不会导致回发到 MVC 中的控制器操作

    当我在 Win7 上的 IE10 或 Chrome 中单击后退按钮时 它不会到达 MVC 控制器中的断点 IE 开发者工具中的 网络 选项卡显示 304 未修改 并且 Fiddler 未捕获该请求 我期待着回帖 这样我就可以在我的控制器中工
  • IHttpModule 和控制台应用程序的流畅 NHibernate 模式

    我目前有一个在存储库模式中使用 Fluent NHibernate LINQ 的 C MVC 2 Web 应用程序 并使用 Ninject 来处理 MVC 控制器的构造函数要求 将其传递到存储库中 我的 Fluent NHibernate
  • Html.BeginForm() 扩展类型

    有谁知道创建自定义 HtmlHelperextension 方法的语法 其行为类似于 p Loads of html stuff here p 我正在思考一些类似的事情 有任何想法吗 Cheers ETF 传真 您需要创建一个实现的类IDi
  • 如何获取类库项目中的连接字符串

    在我的 net 解决方案中 我有两个不同的项目 一个 MVC 核心 Web 应用程序项目和一个类库项目 在Web应用程序项目中 数据库连接字符串位于appsettings json文件 我想从类库项目访问该连接字符串 是否可以 如果是 怎么
  • dotnet 使用 gitlab-ci 为傻瓜发布

    我正在尝试使用 gitlab ci 设置 ci 我对此有几个问题 gitlab ci 上好像没有回滚机制 那么如果部署阶段失败我应该关心回滚吗 我计划使用 dotnetpublishSolution sln crelease 脚本 但我在这
  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • 将自定义 ValueProviderFactories 添加到 ASP.NET MVC3?

    我试图尝试将 Protobuf ValueProviderFactory 添加到 MVC3 以便我可以选择 MIME 类型并将原始数据反序列化为操作参数的对象 我还可以使用它来更改默认的 Json 序列化器 看着JsonValueProvi
  • 找不到 securityToken 的有效键映射

    我正在开发测试应用程序 用于在 MVC ASP net Visual studio 2013 中显示经过身份验证的身份声明 我已通过以下方式从活动目录进行身份验证 1 在解决方案中添加新的mvc项目 2 单击更改身份验证 3 选择组织账户

随机推荐

  • 带有容器和默认分配器的模板模板参数:我可以使我的声明更紧凑吗?

    我正在看这个有趣的话题 https stackoverflow com a 16596463 2436175 我的具体案例涉及使用 opencv 中的 cv Point 和 cv Rect 的 std 容器声明模板化函数 我想要针对以下模板
  • spoj ARRAYSUB:O(n) 复杂度方法

    我试图在 spoj 上解决这个问题http spoj pl problems ARRAYSUB 我用两种方法解决了这个问题 首先使用优化的蛮力 其次在 k 2k 3k 等处进行枢轴并找到最大值 尽管这两种解决方案在最坏情况下都被接受 但复杂
  • 订阅 Meteor.Users 集合

    in server js Meteor publish directory function return Meteor users find fields emails 1 profile 1 in client js Meteor su
  • 强制对象评估为 false

    我猜这可能是特定于应用程序的 但我使用的是node js 只要它在v8引擎中工作 我不介意 我正在尝试创建一个Object评估结果为 false 例如 var Foo function return this var bar new Foo
  • java file.renameTo() 确实重命名文件但返回 false。为什么?

    问题是我需要在其余逻辑工作之前移动文件 因此当该方法返回 false 时我停止执行 但是 当我在 Windows 资源管理器中检查该文件时 它有一个新名称并且已移动 只是好奇为什么会发生这种情况 这是我刚刚尝试重现问题的一些示例代码 这几乎
  • iOS 10 中收不到推送通知

    我的应用程序在 Appstore 中 推送通知在 iOS 9 中工作正常 但在 iOS 10 中不起作用 我没有收到任何 iOS 10 设备的推送通知 我已检查服务器中的设备令牌和证书 全部正确 我还检查了设置应用程序中的通知属性 一切都很
  • 释放鼠标捕获并让鼠标点击通过

    我有一个类似于弹出窗口或菜单的控件 我想显示它 当用户单击框的边界之外时 让它隐藏自己 我使用了 Mouse Capture this CaptureMode SubTree 并以与 OnLostMouseCapture 中的 Menu P
  • google.colab 模块中是否有一个函数可以关闭运行时

    有时 当我在 google colab 中运行时 当运行完成时 我无法留在计算机前手动断开与服务器的连接 即使我的运行已完成 无缘无故占用节点 连接仍保持打开状态 google colab 中是否有一个函数 可以让我插入该函数以在一些纪元后
  • Tensorflow如何恢复具有不同名称但相同形状的权重?

    我在 Tensorflow 中有多种架构 其中一些共享某些部件的设计 我想训练其中一个网络 并在另一个网络中使用相似层的训练权重 此时 我可以保存所需的权重 并将它们重新加载到具有完全相同的变量命名约定的架构中 然而 当两个网络中的权重名称
  • Swing Worker:函数 get()

    我的问题是我不明白如何swingworker有效 因为我想做的是fa worker get 因为我有一个很长的方法 可以计算在后台运行的很多点 因为我不想冻结我的界面 并且我想得到她的结果来绘制组件图像 但我不明白当我这样做时它会去哪里fa
  • 如何检测 html 元素是否可以追加子节点?

    我在我的应用程序中创建了一个名为 loading 的自定义 jquery 事件 当触发此事件时 我想附加一个带有微调器的屏蔽元素 我可以毫无问题地弄清楚那部分 但是 某些元素 图像 表单输入等 无法附加子元素 我需要能够检测此事件的目标是否
  • Android 片段 - findViewById 返回 null [重复]

    这个问题在这里已经有答案了 我有一个在互联网上似乎很常见的问题 我创建了一个仅包含片段的活动 这是生成的代码 Override protected void onCreate Bundle savedInstanceState super
  • Pandas 数据框列值不区分大小写替换 where

    pandas DataFrame replace 是否有不区分大小写的版本 https pandas pydata org pandas docs version 0 21 generated pandas DataFrame replac
  • 用条件列绘制 pandas DataFrame

    我有这种 pandas DataFrame a b 是获取 x 和 y 时的条件 df pd DataFrame 10 20 0 1 10 20 1 5 100 200 0 33 100 200 1 11 columns a b x y d
  • 如何使用 Liquibase 创建数据库

    我正在尝试使用Liquibase创建数据库not exists 我已经下载了MySQL并且没有对其进行任何更改 我的 Maven 插件代码看起来像
  • 将套接字对象发送到分叉运行进程(multiprocessing.Queue)

    我正在学习使用 HTML5 WebSockets 作为学习的一部分 我正在用 Python 编写一个服务器 这样我就可以了解它们如何工作的细节 前几天我创建了一个效果很好的应用程序 但我想扩展它 以便它支持多个端点 每个端点都是一个不同的
  • MVC 3 + $.ajax - 响应似乎正在缓存部分视图的输出

    我一定是错过了什么 愚蠢的 但问题就在这里 我在事务控制器上有一个创建操作 Create cshtml 使用 jQuery 通过调用 ajax 将表单发布到服务器 调试显示一切都按预期到达服务器 我使用表单数据来更新记录 这也很好用 然后
  • 为什么比较和交换 (CAS) 算法是无锁同步的不错选择?

    CAS 属于读取 修改 写入 RMW 系列 这是一组允许您以原子方式执行复杂事务的算法 具体来说 维基百科说 CAS 用于实现信号量和互斥体等同步原语 以及更复杂的无锁和无等待算法 CAS 可以实现比原子读取 写入或获取并添加更多的算法 并
  • 为什么 gcc 或 clang 无法正确 @encode SIMD 向量类型?

    在摆弄向量类型和 ObjC 运行时时 我遇到了一个非常令人困惑的问题 据我所知 clang 或 GCC 都不会为任何 SIMD 向量类型提供 正确的 类型编码 import
  • ASP.NET MVC 4 中 Windows 身份验证和表单身份验证的混合

    我们有一个 ASP NET MVC 4 Intranet 应用程序 我们正在使用 Windows 身份验证 这方面工作正常 使用用户的凭据 我们可以从 Web 应用程序访问这些凭据 然而 我们真正想要的是某种混合模式 我们希望从浏览器获取用