FormsAuthentication登录ReturnUrl使用绝对路径

被这个问题困扰多年,今天终于找到了更简单的解决方法,分享一下。

问题场景

假设我们在i.cnblogs.com站点的web.config中对FormsAuthentication进行了如下的设置:

<authentication mode="Forms">

 <forms name=".cnblogs" loginUrl="https://passport.cnblogs.com/login.aspx" protection="All" path="/"/>

</authentication>

当我们访问一个需要登录后才能访问的URL时,比如:http://i.cnblogs.com/post/list,请求会被重定向至如下的地址:

https://passport.cnblogs.com/login.aspx?ReturnUrl=%2fpost%2flist

瞧!通过ReturnUrl查询参数传递给登录页面的是相对路径——这就是问题所在。由于访问的页面与登录页面不在同一个二级域名下,使用这个相对路径是Return不回来的。

问题的根源

用ILSPY看一下System.Web.Security.FormsAuthentication的代码,立马就能知道问题原因所在:

internal static string GetLoginPage(string extraQueryString, bool reuseReturnUrl)
{
    //...
    if (text2 == null)
    {
        text2 = HttpUtility.UrlEncode(current.Request.RawUrl, current.Request.ContentEncoding);
    }
    text = text + FormsAuthentication.ReturnUrlVar + "=" + text2;
    if (!string.IsNullOrEmpty(extraQueryString))
    {
        text = text + "&" + extraQueryString;
    }
    return text;
}

由码可见,微软根本就无视了登录页面不在同一个二级域名的基本应用场景,而且一直无视到现在。

以前的解决方法

在当前站点添加一个中转页面,由中转页面重定向至登录页面。

于是,web.config的设置变成了如下的样子,先重定向至当前站点的登录中转页面。

<authentication mode="Forms">

 <forms name=".cnblogs" loginUrl="~/account/login" protection="All" path="/"/>

</authentication>

然后,在中转页面使用绝对路径作为ReturnUrl的值,再重定向至真正的登录页面。

中转页面的示例代码如下:

public class AccountController : Controller
{
    public ActionResult Login(string ReturnUrl)
    {
        return Redirect("https://passport.cnblogs.com/login.aspx?ReturnUrl=" +
            HttpUtility.UrlEncode("http://" + Request.Url.Host) + ReturnUrl);
    }
}

虽然解决了问题,但是对于这样的解决方法,我觉得有些啰嗦,总觉得有更好的解决方法,可是一直没找到。

今天再次面对这个问题时,狠了一下心,竟然有了意外的收获!

更简单的解决方法

Forms验证中,工作在第一线、最苦最累的是System.Web.Security.FormsAuthenticationModule。

它在OnEnter(object source, EventArgs eventArgs)中调用了OnAuthenticate方法:

// System.Web.Security.FormsAuthenticationModule
private void OnEnter(object source, EventArgs eventArgs)
{
    //...
    this.OnAuthenticate(new FormsAuthenticationEventArgs(context));
    //...
}

而在OnAuthenticate()方法中有如下的事件处理:

private void OnAuthenticate(FormsAuthenticationEventArgs e)
{
    HttpCookie httpCookie = null;
    if (this._eventHandler != null)
    {
        this._eventHandler(this, e);
    }
    //...
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索登录
, 问题
, 页面
, 方法
, 路径
, returnurl 页面跳转
, c# ilspy
中转
formsauthentication、authentication forms、绝对路径、相对路径和绝对路径、img src 绝对路径,以便于您获取更多的相关知识。

时间: 2024-10-27 07:55:22

FormsAuthentication登录ReturnUrl使用绝对路径的相关文章

如何在不同.net版本实现单点登录

经过研究,重写实现了一个可以在不同.net版本中实现单点登录的简单方法.现在和大家分享一下,不足之处还望见谅   所谓单点登录(Single Sign On就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.其实对于程序员在技术上要实现就得就是多个不同域名间共享cookie的问题. 最近在为ERP添加一个部署在另一台机器上,链接到原有老系统中的子项目,调用原有老项目中的Login实现单点登录,尝试了N次屡试不成,最后确 定问题,是,.net2.0与4.0中对cookie的加

如何在不同.net版本实现单点登录_实用技巧

所谓单点登录(Single Sign On就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.其实对于程序员在技术上要实现就得就是多个不同域名间共享cookie的问题. 最近在为ERP添加一个部署在另一台机器上,链接到原有老系统中的子项目,调用原有老项目中的Login实现单点登录,尝试了N次屡试不成,最后确定问题,是,.net2.0与4.0中对cookie的加密/解密方法由此差异,于是经过研究,重写实现了一个可以在不同.net版本中实现单点登录的简单方法. 1,共用登陆页代

dedecms安全配置,添加登录管理认证码

其实就是在后台登录界面添加个表单验证而已.管理认证,应该知道吧.动易.帝国的那种,本地字符验证,而不是数据库验证,所以SQL查询不了.入侵时碰到这种登录最纠结,最无奈的. 首先看看,我们要改的是这2个文件/(后台路径)/templets/login.htm 这是后台登录界面,/(后台路径)/login.php 登录消息的处理文件. ----0x1 我们先来改login.htm文件,可能大家的模板不一样,不过自己改改吧. 这是验证表单是否为空的代码,可以直接放在HTML里,也可以link到JS文件

详解ASP.NET MVC Form表单验证_实用技巧

一.前言 关于表单验证,已经有不少的文章,相信Web开发人员也都基本写过,最近在一个个人项目中刚好用到,在这里与大家分享一下.本来想从用户注册开始写起,但发现东西比较多,涉及到界面.前端验证.前端加密.后台解密.用户密码Hash.权限验证等等,文章写起来可能会很长,所以这里主要介绍的是登录验证和权限控制部分,有兴趣的朋友欢迎一起交流. 一般验证方式有Windows验证和表单验证,web项目用得更多的是表单验证.原理很简单,简单地说就是利用浏览器的cookie,将验证令牌存储在客户端浏览器上,co

跟我一起学习ASP.NET 4.5 MVC4.0(四)

原文http://www.cnblogs.com/xdotnet/archive/2012/03/27/aspnet_mvc4_authorize.html 前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是 权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action方法上面,这里最主要的是要 介绍怎样将自己的权限验证进行扩展,以及禁止访问的页面转向问题.   下面我们先看一下代码,然后在进行分析,那样就

行为地图在WAP流程中简单的可用性研究

文章描述:行为地图(Behavioral Mapping)在可用性研究中的应用探索. 概念+实战 一.概念篇--传统行为地图(Behavioral Mapping)的概念及应用范围 一种从时间和空间角度,系统的观察研究行为的方法.而这种从时间和空间角度还可以有两个维度进行观察:以人群或个体为观察单位.以地点为观察单位. 以人群或个体为观察单位(好像有点像狗仔队),观察人群/个体的行为.语言.行动路线等,得到关于这个人或这一个体的习性.性格特征等.这种观察更多的是用在动物或者小孩身上,因为当你观察

Linux Sys Monitor系统运维监控器防篡改简介

黑客可能因为一些目的,而攻击您的服务器.常见的比如政府的官方网站首页被篡改. 不常见的比如维基解密创始人朱利安·阿桑奇曾入侵美国国防部等政府机构的网站,控制其两年之久才被发现. 黑客一般入侵之后会修改您的系统文件,为自己留下后门.下次不用再输入密码就能够登录. 比如登录程序:/bin/login文件. 或者修改/bin/ps文件,隐藏自己的木马进程. 为了发现这些系统文件是不是被篡改了,或者您的网站文件是不是被篡改了. 您就需要借助工具来发现它们. 通过此防篡改功能,可以快速的发现并还原它们.

WindowsXP系统注册表解释

   网络篇1 作用:设置IE的自动拨号功能 路径:HKEY_CURRENT_CONFIG\Software\Windows\CurrentVersion\InternetSettings 键值名称:"EnableAutoDial" 数据类型:二进制 键值:值改为01000000 作用:允许IE使用代理服务器 路径:HKEY_CURRENT_CONFIG\Software\Windows\CurrentVersion\InternetSettings 键值名称:"ProxyE

密码管理器的攻防博弈

作为一个会每天访问Freebuf网站的人,或者说是一个对信息安全感兴趣的人,肯定会知道一位用户所有的网络账号不应该都使用相同的密码,这也是一个最基本的安全常识.可是那然后呢? Clipboard Image.png 前言 那么为了让每一个账号都能拥有一个健壮的密码,你可能就需要用到密码管理器了.也许当你第一次使用密码管理器的时候,你心里会有些忐忑不安,毕竟你将所有的密码都放在了这一个地方,而你又可以跨设备跨平台地通过云端来同步自己的密码,这种便捷性肯定会让每一个用户对密码管理器的安全产生质疑.