首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在窗体身份验证重定向之前处理页事件?

如何在窗体身份验证重定向之前处理页事件?
EN

Stack Overflow用户
提问于 2010-03-08 19:37:47
回答 2查看 1.7K关注 0票数 2

我有一个网站,使用基本的ASP.Net表单身份验证。在web.config文件中,我们为各个页面和目录指定了特定的访问规则。一切都很好。

然而,现在我有了一些新的要求。我的域包含许多不同的子域之间的许多不同的网站设置。我有两个映射到此应用程序的DNS子域。一个是aaa.mysite.com,另一个是www.mysite.com。如果从子域aaa.mysite.com接收到对受FormsAuthentication保护的页面的特定web请求,则在处理FormsAuthentication逻辑之前(用户将被重定向到登录页面),我想首先执行一些代码。这段代码实际上会尝试从第三个子域(比如zzz.mysite.com )读取cookie,如果不存在,则通过Response.Redirect访问zzz.mysite.com应用程序中的登录页面。

我尝试通过一个基类来处理此问题,然后调用Page_PreInit函数中的特殊代码。但是,即使在调用PreInit函数之前,FormsAuthentication也会处理到登录页面的重定向。

有没有人知道处理这种情况的好方法?如果Page_PreInit不能工作,我可以把代码放在哪里,以便在FormsAuthentication重定向之前执行,但在哪里我也可以访问它所在的页面(以及它从哪个类继承,这样我就可以看到它是从System.Web.UI.Page继承的,还是从我的特殊BasePage继承的)。

有什么想法吗?我想我可以使用全局Application_BeginRequest,但是这样每个请求都会被调用,这看起来不是一个很好的主意。

我不是第一个需要在FormsAuthentication之前处理事件的人,所以如果你能给我一些额外的想法,我将非常感激!

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-08 19:58:18

如果cookie已写入zzz.example.com,则www.example.com上的站点无法读取它-跨子域共享cookie的方法是将它们写入.example.com

这可以在表单身份验证中使用web.config中forms element上的domain属性进行配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<forms [...]
   domain=".example.com">

注意域名中的前导句点。

编辑以响应评论

您可能应该连接到PostAuthenticateRequest event -这是在建立用户身份(或缺少)之后触发的,并且您可以注册一个custom HttpModule来接收此事件。

显示workings的编辑

好了,我刚刚测试了以下设置:

web应用程序项目,目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/Default.aspx                    -- Simple aspx page.
/Login.aspx                      -- Simple aspx page, with a Login control.
/web.config                      -- Main application config.
/Classes/CheckingAuthenticate.cs -- HttpModule, configured in root.
/Restricted/Default.aspx         -- Simple asp page.
/Restricted/web.config           -- Config file for authorization

因此,根web.config使用标准的ASP.NET成员资格提供程序设置表单身份验证,并将/Login.aspx设置为登录页面。我还在其中注册了一个自定义HttpModule:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<httpModules>
  <add name="CheckingAuthenticate" 
       type="TempWebApp.Classes.CheckingAuthenticate"/>
  [...]
</httpModules>

/Restricted/中的web.config拒绝匿名用户访问(这同样可以在根目录中的<location>元素中完成):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<configuration>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

然后在我的http模块中有以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Web;
using System.Web.Security;

namespace TempWebApp.Classes {
  public class CheckingAuthenticate : IHttpModule {

    public void Dispose() {
        //clean-up code here.
    }

    public void Init(HttpApplication context) {
      context.PostAuthenticateRequest += OnPostAuthenticate;
    }

    public void OnPostAuthenticate(object sender, EventArgs e) {
      var app = sender as HttpApplication;

      if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(app.Request.Path,
                                                            app.User,
                                                            "GET")){
        //Code here to read cookies, redirect user etc.
      }
    }
  }
}

这将在用户通过身份验证之后触发,但在ASP.NET尝试授权用户之前触发,这样您就有机会自己检查访问并进行重定向。我已经很高兴地找到了断点。如果用户没有访问这些页面的权限,我就无法看到AuthorizeRequest或PostAuthorizeRequest事件。

票数 1
EN

Stack Overflow用户

发布于 2010-03-08 19:55:30

我认为您应该使用AuthenticateRequest事件。请参阅lifecycle。不要担心每次请求时都会发生这种情况,很多事情都是这样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2404154

复制
相关文章
如何在Ubuntu上安装Buildbot
Buildbot是一个基于Python的持续集成系统,用于自动化软件构建,测试和发布。它使用Python的Twisted库来处理buildmaster和多个worker之间的异步通信,以便在多个平台上测试构建。Buildbot具有高度可配置性并且几乎可秒级应对构建过程,使其适用于复杂的构建过程或需要其工具随项目的独特需求而增长的项目。在本教程中,我们将在同一台机器上安装和配置Buildbot buildmaster和worker。
林岑影
2018/07/27
2.2K0
如何在Ubuntu上安装Docker?
Docker是一种流行的容器化平台,用于在不同的环境中快速部署和运行应用程序。它提供了一种轻量级和便捷的方式来封装、分发和管理应用程序及其依赖项。本文将详细介绍如何在Ubuntu上安装Docker,以便您能够开始使用Docker来构建和管理容器化的应用程序。
网络技术联盟站
2023/09/04
25.2K2
如何在Ubuntu上安装Docker?
如何在Ubuntu上安装Go
Go是由Google开发的编译的静态类型编程语言。许多现代应用程序,包括Docker,Kubernetes和Caddy,都是用Go编写的。本文将介绍如何在Ubuntu系统上安装GO语言开发运行环境。学习本文你需要一台已经设置好可以使用sudo命令的非root账号的服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费**的腾讯云开发者实验室进行试验,学会安装后在购买服务器。
何处惹尘埃
2018/08/17
1.7K0
如何在Ubuntu上安装Jenkins
Jenkins是一个开源自动化服务器,旨在自动执行持续集成和交付软件所涉及的重复技术任务。Jenkins是基于Java开发,可以从Ubuntu软件包安装,也可以使用ARchive(WAR)文件构成一个完整的Web应用程序,在服务器上运行。
宇cccc
2018/08/03
1.6K0
如何在Ubuntu上安装Jenkins
如何在Ubuntu上安装ionCube
ionCube是一个PHP模块扩展,可加载加密的PHP文件并加速网页。ionCube Encoder可以把PHP源代码转换成ByteCode。进行加密授权处理后的PHP代码就不在开源了,必须使用ionCube loader才可以执行加密过的PHP代码。PHP本身没有带有ionCube loader模块, 必须到ionCube网站下载。在本教程中,我们将在Ubuntu 16.04服务器上安装ionCube。
尘埃
2018/07/31
1.9K0
如何在Ubuntu上安装ionCube
如何在Ubuntu上安装ownCloud
ownCloud是一个自由且开源的个人云存储解决方案,包括两个部分:服务器和客户端。ownCloud 最早由KDE开发者Frank Karlitschek于2010年一月创建,目标是成为商业云服务提供商的替代。与商业云存储服务不同,ownCloud可以自由获取无需付费,但相应地,用户必须自行架设 ownCloud的服务器,这需要一点技术。在本教程中,我们将教你在Ubuntu 18.04服务器上安装和配置ownCloud服务器。
司徒永哥
2018/08/01
3.5K0
如何在Ubuntu上安装ownCloud
如何在Ubuntu上安装SELinux
Ubuntu有一个类似于SELinux的强制访问控制系统,名为AppArmor。SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。SELinux和AppArmor都提供了一组工具来隔离应用程序,以保护主机系统免受攻击。AppArmor为Ubuntu用户提供强制访问控制选项,没有SELinux可能遇到的困难或学习曲线效应。如果您想要切换到Ubuntu,已经熟悉SELinux并希望使用它来强制系统的安全性,您可以按照这个简短的教程安装它。
挺问中原
2018/08/16
12.5K2
如何在Ubuntu上安装MutliCraft
PS:本文撰写前已查询相关法律,本文内容不违反《互联网文化管理暂行规定》,遵守EULA协议,请勿举报。
宇cccc
2018/08/14
3K0
如何在Ubuntu上安装MutliCraft
如何在Ubuntu上安装MySQL/MariaDB
本教程面向Ubuntu服务器,适用于Ubuntu的任何LTS版本,包括Ubuntu 14.04,Ubuntu 16.04,Ubuntu 18.04,甚至非LTS版本(如Ubuntu 17.10和其他基于Ubuntu的发行版)。我们在Ubuntu 16.04服务器上测试了这个。
星哥玩云
2022/08/16
1.9K0
如何在Ubuntu 16.04上安装MongoDB
MongoDB是一个免费的开源NoSQL文档数据库,在现代Web应用程序中常用。本教程将帮助您在服务器上为生产应用程序环境设置MongoDB。
何处惹尘埃
2018/10/11
1.7K0
如何在 Ubuntu 20.04 上安装 MySQL
https://www.itcoder.tech/posts/how-to-install-mysql-on-ubuntu-20-04/
雪梦科技
2020/04/29
6.6K0
如何在 Ubuntu 20.04 上安装 MySQL
如何在 Ubuntu 20.04 上安装 Vagrant
本文最先发布在:https://www.itcoder.tech/posts/how-to-install-vagrant-on-ubuntu-20-04/
雪梦科技
2020/06/04
1.4K0
如何在 Ubuntu 20.04 上安装 Vagrant
如何在 Ubuntu 20.04 上安装 MariaDB
本文最先发布在:https://www.itcoder.tech/posts/how-to-install-mariadb-on-ubuntu-20-04/
雪梦科技
2020/05/22
3.7K0
如何在 Ubuntu 20.04 上安装 MariaDB
如何在 Ubuntu 20.04 上安装 Elasticsearch
Elasticsearch 是一个开源全文搜索和分析引擎。它支持 RESTful 操作,并且允许你存储,搜索,并且实时分析大量的数据。Elasticsearch是最流行的搜索引擎之一,可为具有复杂搜索要求的应用程序提供动力,例如大型电子商务商店和分析应用程序。
雪梦科技
2020/07/08
9.9K3
如何在 Ubuntu 20.04 上安装 TeamViewer
TeamViewer 是一个跨平台解决方案,它可以被用来进行远程控制,桌面共享,在线会议,以及计算机之间的文件传输。
雪梦科技
2020/06/30
5.8K0
如何在 Ubuntu 20.04 上安装 TeamViewer
如何在Ubuntu 18.04上安装Jenkins
Jenkins是一个开源自动化服务器,可以自动执行持续集成和交付软件所涉及的重复技术任务。Jenkins是基于Java的,可以从Ubuntu软件包安装,也可以通过下载和运行其Web应用程序存档(WAR)文件来安装 - 该文件是构成在服务器上运行的完整Web应用程序的文件集合。
吴凌云
2018/10/09
4.7K0
如何在Ubuntu 14.10 上安装WordPress?
WordPress 是一种使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把  WordPress 当作一个内容管理系统( CMS )来使用。
星哥玩云
2022/07/04
5620
如何在Ubuntu 14.10 上安装WordPress?
如何在Ubuntu 16.04上安装Nginx
Nginx是世界上最受欢迎的网络服务器之一,负责托管互联网上一些规模最大,流量最高的网站。在大多数情况下,它比Apache更加资源友好,可以用作Web服务器或反向代理。
小皇帝James
2018/10/11
2.4K0
如何在 Ubuntu 20.04 上安装 Git
Git 是世界上最流行的分布式版本控制系统,它被众多的开源和商业项目所采用。它允许你和你的开发同事进行分工合作,跟踪你的代码变化,恢复前一个暂存区,创建分支等等。
雪梦科技
2020/05/11
8840
如何在 Ubuntu 20.04 上安装 Nginx
Nginx 发音 “engine x” ,是一个开源软件,高性能 HTTP 和反向代理服务器,用来在互联网上处理一些大型网站。它可以被用作独立网站服务器,负载均衡,内容缓存和针对 HTTP 和非 HTTP 的反向代理服务器。
雪梦科技
2020/05/11
2.1K0

相似问题

PHP:将特定的csv行读取到二维数组中

30

将文件读取到特定行php

30

PHP将txt从特定行读取到末尾。

24

将CSV中的特定列读取到阵列

31

特定CSV读滤波

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文