关键字:FormsAuthentication, loginUrl, ReturnUrl, AbsoluteUri

在ASP.NET应用程序中,FormsAuthentication几乎是标配,但FormsAuthentication在设计时却没有考虑登 录程序与当前程序不在同一个站点的场景。这个场景最基本的需求就是去另一个站点登录成功后返回要原地。可是FormsAuthentication在传递 ReturnUrl时只支持相对路径,不支持绝对地址,也没有提供相应的扩展。

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

<authentication mode="Forms"><forms loginUrl="http://passport.cnblogs.com/login.aspx" timeout="2880" enableCrossAppRedirects="true"/></authentication>      <authorization><deny users="?"/></authorization>

访问admin.cnblogs.cc/Home/Index,会被重定向至passport.cnblogs.com/login.aspx?ReturnUrl=%2fHome%2fIndex,这样登录后就回不来了。

那如何解决这个问题呢?

目前找到了三种方法:

方法一:在当前应用程序添加一个登录跳板页,web.config中的loginUrl指向该跳板,在跳板中获取ReturnUrl的绝对地址,再重定向至实际登录页面。

比如在ASP.NET MVC中,我们可以用一个Controller的Action作为跳板,代码如下:

public class LoginController : Controller{public ActionResult Redirect()    {        var loginUrl = "http://passport.cnblogs.com/login.aspx";        var returnUrl = "?ReturnUrl=http://" + Request.Url.Host +            Request.QueryString["ReturnUrl"];return RedirectPermanent(loginUrl + returnUrl);    }}

然后将web.config中的loginUrl指向该Action。

该方法的缺点是要进行两次重定向。

方法二:在Global.asax的Application_PostAuthenticateRequest事件中将ReturnUrl设置为绝对地址,并重定向至登录页面。

代码如下(代码来自http://forums.asp.net/t/1358796.aspx):

protected void Application_PostAuthenticateRequest(object sender, EventArgs e){if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(        Request.AppRelativeCurrentExecutionFilePath,        Context.User, Request.RequestType))    {        Response.Redirect(String.Format("{0}?ReturnUrl={1}",            FormsAuthentication.LoginUrl,            Request.Url.AbsoluteUri));    }}

方法三:在Global.asax的Application_EndRequest事件中修改Response.RedirectLocation,将ReturnUrl的替换为绝对地址。

代码如下(代码来自David Findley's Blog):

protected void Application_EndRequest(object sender, EventArgs e){string redirectUrl = this.Response.RedirectLocation;if (!string.IsNullOrEmpty(redirectUrl))    {this.Response.RedirectLocation = Regex.Replace(redirectUrl, "ReturnUrl=(?'url'.*)", delegate(Match m)        {string url = HttpUtility.UrlDecode(m.Groups["url"].Value);            Uri u = new Uri(this.Request.Url, url);return string.Format("ReturnUrl={0}", HttpUtility.UrlEncode(u.ToString()));        }, RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);    }}

该方法的缺点是要针对所有重定向的URL进行处理,不仅仅是登录。

我们选用的是第二种方法。你是如何解决这个问题的?有没有更好的方法?

这个问题完全归咎于FormsAuthentication的设计问题,当时遇到这个问题,都不敢相信微软没考虑到这个,然后看了一下FormsAuthentication的代码,真是无语。。。

转载于:https://www.cnblogs.com/zxktxj/p/3359890.html

ASP.NET FormsAuthentication跨站点登录时绝对地址返回的问题相关推荐

  1. ASP.NET 2.0站点登录、导航与权限管理

    (一)登录 asp.net 2.0中,新增了许多新的功能和控件.其中,新增的登陆控件可谓使得WEB应用的设计更加得心应手.什么是登陆控件呢?就是我们平常在WEB应用中经常要用到的用户注册,登陆,忘记密 ...

  2. vue3登录时后台返回状态码不是200,怎么还跳转

    代码如下 特别烦,不知道出了什么原因??难道是我if语句还有问题?即便是每一个匹配错误的状态还是加了跳转到首页却还是会跳转到主页 function login(){axios.post('/api/l ...

  3. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    本博文翻译自: https://dotnetcoretutorials.com/2017/10/25/owasp-top-10-asp-net-core-cross-site-scripting-xs ...

  4. 一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...

  5. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

  6. 完全跨站点跨域名单点(SSO)同步登录和注销

    先来说说什么是单点登录(SSO).来自百科的介绍:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主 ...

  7. 网络安全-已解密的登录请求,会话标识未更新,跨站点请求伪造

    这些没有那么麻烦,一天就搞定了.所以简单记录一下. 已解密的登陆请求是非常简单的,随便找个浏览器,火狐谷歌都行.打开F12找到网络 就可以非常清楚的看到这里是明文密码.虽然这里是客户端,还没有到传输阶 ...

  8. 记录如何防止跨站点脚本攻击之抄写

    一.简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞. ...

  9. 跨站点脚本(XSS)

    1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞 ...

  10. 如何防止跨站点脚本攻击

    1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞 ...

最新文章

  1. 炒菜机器人煎鸡蛋视频_我的生活小技巧,今天才发现鹅油那么好用,炸鸡蛋炸豆腐都挺好...
  2. SQL Server -- LIKE模糊查询
  3. stm32官方例程在哪找_STM32开发学习资料合集
  4. 兰州大学计算机考研专硕学费,2018年兰州大学在职硕士研究生学费标准
  5. Scala模式匹配:for循环表达式中的模式匹配
  6. 国科大学习资料--操作系统(杨力祥)--2017年思考题
  7. 中台架构的未来在哪—开放式架构
  8. vb科学计算机ppt,《计算机级VB教程》PPT课件.ppt
  9. python中的pika模块
  10. 拳皇觉醒服务器维护,拳皇觉醒手游预约_腾讯拳皇觉醒新版v1.0.0_第一手游网
  11. 《長江圖》:一首關於一切的魔幻愛情史詩
  12. Android HTTP边下边播
  13. 用wxBot和图灵机器人API实现微信群聊机器人
  14. Word2vec简单整理
  15. CODESOFT6 二维码中追加回车
  16. java ftp传图片_Java 图片上传方式一 : ftp 图片服务器
  17. MySQL:一主两从架构(读写分离)
  18. 计算机常用英语单词[转]
  19. 【开发指南】AR Foundation 开发环境部署
  20. MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(四)高侧非隔离栅极驱动

热门文章

  1. Unix网络-select
  2. win10系统安装postgresql后无法连接
  3. 软件测试——第三次作业
  4. AHOI2018训练日程(3.10~4.12)
  5. css选择器思维导图
  6. Python内置函数(7)——sum
  7. BOM对象有哪些,列举window对象?
  8. 东芝MCU实现位带操作
  9. POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)
  10. ORACLE与.NET类型对应关系(转)