在混合 MVC/WebForms Web 应用程序中配置授权

2023-11-30

我目前正在将 WebForms/MVP 应用程序的一些组件迁移到 MVC 中。到目前为止,除了授权之外,一切正常。无论如何,当我导航到 MVC 版本的登录页面时,我会被重定向到在Web.config:

    <authentication mode="Forms">
      <forms name=".MyWebSite" enableCrossAppRedirects="true" loginUrl="Login.aspx" timeout="60" path="/" defaultUrl="~/Pages/Landing.aspx"></forms>
    </authentication>

我尝试过使用AllowAnonymous但似乎 webforms 配置优先。这是我的登录控制器:

[RouteArea("User", AreaPrefix = "")]
public class AuthenticationController : Controller {
    [Route("Login")]
    [AllowAnonymous]
    public ActionResult Login() {
        return View();
    }
}

我的目录结构如下所示:

> Web Project
   > Areas
      > User 
          > Controllers
              > AuthController
          > Views
              > Login.cshtml

在我的 web.config 中,我看到以下内容允许匿名访问错误页面:

  <location path="Error">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

然而,复制这个Areas路径不起作用(大概是因为 cshtml 文件实际上并不像 aspx 页面那样位于那里?)。

现在,如果我登录(通过 aspx 版本的登录)并且我的用户已通过身份验证,我就可以很好地访问 MVC 实现。路由和渲染工作得非常好。它只是允许未经身份验证的用户访问 MVC 页面(不重定向到 aspx 实现),这似乎是一个挑战。我究竟做错了什么?

EDIT我发现了一个非常hacky的部分解决方案(基于关闭一个子目录的 ASP.Net WebForms 身份验证)如下:

    protected void Application_BeginRequest(object sender, EventArgs e) {
        // lots of existing web.config controls for which webforms folders can be accessed
        // read the config and skip checks for pages that authorise anon users by having
        // <allow users="?" /> as the top rule.
        // https://stackoverflow.com/questions/4616524/turning-off-asp-net-webforms-authentication-for-one-sub-directory

        // check local config
        var localAuthSection = ConfigurationManager.GetSection("system.web/authorization") as AuthorizationSection;

        // this assumes that the first rule will be <allow users="?" />
        var localRule = localAuthSection.Rules[0];
        if (localRule.Action == AuthorizationRuleAction.Allow && localRule.Users.Contains("?")) {
            // then skip the rest
            return;
        }

        // get the web.config and check locations
        var conf = WebConfigurationManager.OpenWebConfiguration("~");
        foreach (ConfigurationLocation loc in conf.Locations) {
            // find whether we're in a location with overridden config

            // get page name
            var currentPath = Path.GetFileName(this.Request.Path);
            if (currentPath.Equals(loc.Path, StringComparison.OrdinalIgnoreCase)) {
                // get the location's config
                var locConf = loc.OpenConfiguration();
                var authSection = locConf.GetSection("system.web/authorization") as AuthorizationSection;
                if (authSection != null) {
                    // this assumes that the first rule will be <allow users="?" />
                    var rule = authSection.Rules[0];
                    if (rule.Action == AuthorizationRuleAction.Allow && rule.Users.Contains("?")) {
                        // then skip the rest
                        return;
                    }
                }
            }
        }
    }

这意味着我可以像这样指定“登录”:

  <location path="Login">
    <system.web>
      <authorization>
        <allow users="?" />
      </authorization>
    </system.web>
  </location>

但是,除非我仔细检查并为这些文件类型添加规则,否则所有关联的 CSS/JS 都不会被渲染。有got对此进行更优雅的修复。


我找到了我认为的proper解决方案。在我的网络配置,我设置了loginUrl到我的 MVC 页面:

    <authentication mode="Forms">
      <forms name=".MyWebSite" enableCrossAppRedirects="true" loginUrl="Login" timeout="60" path="/" defaultUrl="~/Pages/Landing.aspx"></forms>
    </authentication>

然后我必须在我的 authController 中设置 cookie,这样当我重定向到 aspx 页面时,HttpContext.CurrentUser被定义为登录用户:

FormsAuthentication.SetAuthCookie(model.Username, true);

我不知道这是否确实是正确的方法,但到目前为止它似乎有效。如果有人有任何反馈,我将保持开放状态。

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

在混合 MVC/WebForms Web 应用程序中配置授权 的相关文章

随机推荐

  • 由未知权威机构签署的 x509 证书 - go-pingdom

    我正在使用 Go 包pingdom go查询 Pingdom 该应用程序容器化如下 FROM alpine 3 8 USER nobody ADD build output bin app usr local bin app 但是我收到以下
  • android - 导入 - 与开发人员 google com games

    我按照这里的指南进行操作https developers google com games 我完成了步骤 1 中的所有说明 步骤 1 下载示例应用程序 但该项目未编译 导入 google play services lib 项目和 Base
  • 将图例添加到 ggplot2

    我一直在尝试向我的 ggplot 添加图例 但惨败 我确实遇到了与手动添加图例相关的其他问题 例如1 2但无法将答案应用到我的 ggplot 上 我尝试了该功能scale colour manual但传说并没有出现 任何帮助将非常感激 p
  • 欧拉计划 17

    我一直在尝试解决欧拉 17 问题 但遇到了一些麻烦 该问题的定义是 如果数字 1 到 5 用单词写成 一 二 三 四 五 那么总共使用了 3 3 5 4 4 19 个字母 如果从 1 到 1000 一千 的所有数字都用文字写出来 需要使用多
  • “必需”验证属性在 asp.net mvc 3 中不起作用,而其他属性则有效

    我有一个奇怪的情况 我为我的实体对象创建了一个单独的验证类 MetadataType typeof TopTenFav Validation public partial class TopTenFav public class TopTe
  • 为什么我的代码块仅显示输出不到一秒......?

    我一周前安装了 Codeblock 没有更改任何设置 我创建了一个简单的控制台应用程序 当我单击 构建 并运行它时 它会显示我的输出大约几毫秒然后消失 它过去会永远保留 直到我退出它 有谁知道为什么会发生这种情况 在 构建日志 选项卡中显示
  • 紧急安装并与 Orion Context Broker 集成

    在 Rush 中运行监听器和一次消费者之后 我运行 contextBroker rush localhost 5001 我确保使用 Orion 0 17 而不是 0 14 输入 version url 后显示的是
  • 添加CombinedResourceHandler后pe:ckEditor不再工作

    I added OmniFaces使用CombinedResourceHandler 但现在PrimeFaces 扩展
  • 如何将协议定义为 @ObservedObject 属性的类型?

    我有一个依赖于视图模型的 swiftui 视图 视图模型有一些已发布的属性 我想为视图模型层次结构定义一个协议和默认实现 并使视图依赖于协议而不是具体类 我希望能够写出以下内容 protocol ItemViewModel Observab
  • 导入 .p12 文件中包含的所有证书

    我有一个 p12我的 ASP NET 应用程序通过 HTTPS 连接到 Web 服务的文件 我正在尝试导入 p12文件保存到本地计算机 我的商店中 这 p12 file 包含多个证书 一个包含私钥 另一个是 CA 证书以完成链 目前 我正在
  • Prestashop - 如何写入日志文件?

    我应该在 Prestashop 模块中使用什么 php 代码来写入日志文件 我用过 Logger addLog something 1 但它不起作用 您还可以使用以下代码将日志存储在文件中 logger new FileLogger 0 0
  • HTML5 拖放 拖动时更改图标/光标

    我想知道当我拖动 dragover dragenter 图标 光标时如何更改例如拒绝或允许部分 当然 我可以用光标移动绝对定位的 DOM 部分 但我对原生 HTML5 解决方案感兴趣 Thanks 你在追寻掉落效果 在dragstart中初
  • 按模式递归添加文件

    如何通过位于不同目录中的模式 或全局 递归添加文件 例如 我想添加A B C foo java and D E F bar java 以及其他几个 java 文件 使用一个命令 git add java 不幸的是 这并没有按预期工作 您可以
  • lstat:无法访问另一个目录中的文件

    我正在尝试编写类似 ls 的程序 产生类似的输出ls l包含文件的权限 所有者 时间和名称 如果我通过的话效果很好 或什么都没有 所以它适用于当前目录 但是如果我将任何其他目录传入或传出当前目录 perror说它 无法访问 文件 请帮我找出
  • 使用 XAMPP 启用 SSL

    我一直在尽可能地遵循本指南http robsnotebook com xampp ssl encrypt passwords 然而 每当我浏览到以 https 开头的页面时 apache 服务器都会回复 404 未找到对象 我缺少什么设置
  • Python 3.2:cx_freeze 编译我的程序,但处于调试模式

    我正在使用 Python 3 2 和 Pygame 制作游戏 我已经成功地使用了cx freeze将所有内容捆绑到可执行文件中 然后运行 美好的 唯一的问题是 即使当我通过 OO标记我的setup py 我的游戏是在调试模式下编译的 我已经
  • NHibernate / MySQL 字符串连接

    我有一个 nhibernate linq 查询 如下所示 from b in session Query
  • 如何以编程方式在 Active Directory 中搜索打印机

    尝试使用 C 在 Active Directory 中查找打印机 共享 这是我适用于用户的示例代码 但是我看不到能够找到使用相同概念的打印机 我是 Active Directory 新手 DirectoryEntry entry new D
  • httprouter配置NotFound

    我在用着httprouter对于 API 我正在尝试找出如何处理 404 它确实说在docs404 可以手动处理 但我真的不知道如何编写自己的自定义处理程序 在我的其他路线之后我尝试了以下方法 router NotFound pageNot
  • 在混合 MVC/WebForms Web 应用程序中配置授权

    我目前正在将 WebForms MVP 应用程序的一些组件迁移到 MVC 中 到目前为止 除了授权之外 一切正常 无论如何 当我导航到 MVC 版本的登录页面时 我会被重定向到在Web config