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 强大的扩展与配置能力相对优雅地消除了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
下一篇: 详解Angular2组件之间如何通信