ASP.NET Core 实现跨站登录重定向的新姿势
作为 .NET 程序员,痛苦之一是自从 ASP.NET 诞生之日起直到最新的 ASP.NET Core 都无法直接实现跨站登录重定向(比如访问 https://q.cnblogs.com ,跳转到 https://passport.cnblogs.com 进行登录),只能跳转到当前站点。
具体拿 ASP.NET Core 来说就是 CookieAuthenticationOptions.LoginPath 只能指定路径,不能指定包含主机名的完整 url ,ASP.NET Core 会在重定向时自动加上当前请求的主机名。
services.AddAuthentication()
.AddCookie(options =>
{
options.LoginPath = "/account/signin";
});
ReturnUrl 查询参数也只会包含路径,不包含完整的 url 。
为了解痛,在 ASP.NET 时代我们服用的解药要么是不用 ASP.NET 的登录跳转机制,要么通过专门的 UserController.Login Action 进行二次跳转,在 ASP.NET Core 时代我们改服了 Middleware 的解药,在专门的 Middleware 中进行跳转(也比较麻烦)。
昨天在阅读了 ASP.NET Core Authenticaion 的源码后,我们找到了一种新的解药 —— 修改 CookieAuthenticationEvents.OnRedirectToLogin 委托实现跨站登录重定向。
以下是新解药制作方法。
在 Startup.ConfigureServices 中给 AddCookie 添加如下的配置代码以使用修改后的 url 进行重定向:
services.AddAuthentication()
.AddCookie(options =>
{
var originRedirectToLogin = options.Events.OnRedirectToLogin;
options.Events.OnRedirectToLogin = context =>
{
return originRedirectToLogin(RebuildRedirectUri(context));
};
});
RebuildRedirectUri 的实现代码如下:
private static RedirectContext<CookieAuthenticationOptions> RebuildRedirectUri(
RedirectContext<CookieAuthenticationOptions> context)
{
if (context.RedirectUri.StartsWith(ACCOUNT_SITE))
return context; var originUri = new Uri(context.RedirectUri);
var uriBuilder = new UriBuilder(ACCOUNT_SITE);
uriBuilder.Path = originUri.AbsolutePath;
var queryStrings = QueryHelpers.ParseQuery(originUri.Query);
var returnUrlName = context.Options.ReturnUrlParameter;
var returnUrl = originUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped) + queryStrings[returnUrlName];
uriBuilder.Query = QueryString.Create(returnUrlName, returnUrl).ToString();
context.RedirectUri = uriBuilder.ToString();
return context;
}
以上一堆代码用于实现 url 的转换,详见博问 https://q.cnblogs.com/q/108087/
这个长久以来的痛苦总算基于 ASP.NET Core 强大的扩展与配置能力相对优雅地消除了。
ASP.NET Core 实现跨站登录重定向的新姿势的更多相关文章
- ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击 (转载)
什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...
- ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击
什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...
- NET Core 防止跨站请求
ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击 什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可 ...
- Asp.Net Core Identity 完成注册登录
Identity是Asp.Net Core全新的一个用户管理系统,它是一个完善的全面的庞大的框架,提供的功能有: 创建.查询.更改.删除账户信息 验证和授权 密码重置 双重身份认证 支持扩展登录,如微 ...
- ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的方法
在HTTP POST请求中,我们多次在View和Controller中看下如下代码: View中调用了Html.AntiForgeryToken(). Controller中的方法添加了[Valida ...
- ASP.NET Core 集成测试中模拟登录用户的一种姿势
不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...
- Asp.net Core CORS 跨域
本文主要介绍在Asp.net Core采用CORS方式解决跨域 关于跨域的原理介绍可参考Asp.net Web API 解决跨域详解 1 在Startup添加允许跨域的策略 services.AddC ...
- ASP.Net Core 2.1+ Cookie 登录授权验证【简单Cookie验证】
介绍 本文章发布于博客园:https://www.cnblogs.com/fallstar/p/11310749.html 作者:fallstar 本文章适用于:ASP.NET Core 2.1 + ...
- ASP.NET Core 启用跨域请求
本文翻译整理自:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1 一 .Cross-Orig ...
随机推荐
- Python import其他文件夹的文件
一般情况下,import的文件和被import的文件在同一个路径下面,import也比较方便.如果这两个文件不在一个路径下面,import就比较麻烦了,需要在被import的文件路径下面新建一个__i ...
- Base标签小记:更改当前页面的地址
一般来说,H5游戏的部署,index.html和代码资源都会放在同一个地址下然后使用iFrame导入到需要加载游戏的页面即可. 但是今天游戏项目部署遇到了一个问题,游戏自己的访问页面(index.ht ...
- Sublime Text 输入法跟随光标
通过PackageControl安装“IMESupport”,重启Sublime Text3,即可解决: 注:如项目自述,仅支持Windows.
- 【转】pymongo实现模糊查询
pymongo 模糊匹配查询在mongo中这样实现 {'asr':/若琪/} 使用pymongo 两种实现方式 1.import re {'asr':re.compile('若琪')} 2.{'asr ...
- Tensorflow 与Caffe(转)
TensorFlow TensorFlow 是相对高阶的机器学习库,用户可以方便地用它设计神经网络结构,而不必为了追求高效率的实现亲自写 C++或 CUDA 代码.它和 Theano 一样都支持自动求 ...
- 大话前端解析Json对象
一.对于标准的json对象如: var result=[{"flag":1,"macId":"2","mbId":0,& ...
- 【转】Cowboy 开源 WebSocket 网络库
原文链接: http://www.cnblogs.com/gaochundong/p/cowboy_websockets.html
- ABAP 文件选择框
GUI_FILE_SAVE_DIALOG CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE EXPORTING ...
- java多线程的3种写法
1.Thread /** * */ package testJava2.thread; /** * @author xxx.sjtu * @function * @date 2017年5月17日 * ...
- 异常处理与MiniDump 用于投放市场c++异常捕获
最近一段时间,新上线的软件在外场偶尔会出现异常崩溃的情况.由于试用范围比较分散,很难一一前往现场定位问题.而传统的log日志方法,在崩溃的情况下,并不能比较准确的表示出问题位置,这使得软件调试进程缓慢 ...