ASP.NET Core跨站登录重定向的实现新姿势
前言
作为.NET程序员,痛苦之一是自从ASP.NET诞生之日起直到最新的ASP.NETCore都无法直接实现跨站登录重定向(比如访问https://q.cnblogs.com,跳转到https://passport.cnblogs.com进行登录),只能跳转到当前站点。
具体拿ASP.NETCore来说就是CookieAuthenticationOptions.LoginPath只能指定路径,不能指定包含主机名的完整url,ASP.NETCore会在重定向时自动加上当前请求的主机名。
services.AddAuthentication() .AddCookie(options=> { options.LoginPath="/account/signin"; });
ReturnUrl查询参数也只会包含路径,不包含完整的url。
为了解痛,在ASP.NET时代我们服用的解药要么是不用ASP.NET的登录跳转机制,要么通过专门的UserController.LoginAction进行二次跳转,在ASP.NETCore时代我们改服了Middleware的解药,在专门的Middleware中进行跳转(也比较麻烦)。
昨天在阅读了ASP.NETCoreAuthenticaion的源码后,我们找到了一种新的解药——修改CookieAuthenticationEvents.OnRedirectToLogin委托实现跨站登录重定向。
以下是新解药制作方法。
在Startup.ConfigureServices中给AddCookie添加如下的配置代码以使用修改后的url进行重定向:
services.AddAuthentication() .AddCookie(options=> { varoriginRedirectToLogin=options.Events.OnRedirectToLogin; options.Events.OnRedirectToLogin=context=> { returnoriginRedirectToLogin(RebuildRedirectUri(context)); }; });
RebuildRedirectUri的实现代码如下:
privatestaticRedirectContextRebuildRedirectUri( RedirectContext context) { if(context.RedirectUri.StartsWith(ACCOUNT_SITE)) returncontext; varoriginUri=newUri(context.RedirectUri); varuriBuilder=newUriBuilder(ACCOUNT_SITE); uriBuilder.Path=originUri.AbsolutePath; varqueryStrings=QueryHelpers.ParseQuery(originUri.Query); varreturnUrlName=context.Options.ReturnUrlParameter; varreturnUrl=originUri.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)+queryStrings[returnUrlName]; uriBuilder.Query=QueryString.Create(returnUrlName,returnUrl).ToString(); context.RedirectUri=uriBuilder.ToString(); returncontext; }
以上一堆代码用于实现url的转换,详见博问https://q.cnblogs.com/q/108087/
这个长久以来的痛苦总算基于ASP.NETCore强大的扩展与配置能力相对优雅地消除了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。