欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET Core跨站登录重定向的实现新姿势

程序员文章站 2022-03-21 15:13:36
前言 作为 .net 程序员,痛苦之一是自从 asp.net 诞生之日起直到最新的 asp.net core 都无法直接实现跨站登录重定向(比如访问 https://q....

前言

作为 .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 强大的扩展与配置能力相对优雅地消除了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。