欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET Core跨站登錄重定向的實(shí)現(xiàn)新姿勢(shì)

 更新時(shí)間:2018年07月22日 14:09:19   作者:dudu  
這篇文章主要給大家介紹了關(guān)于ASP.NET Core實(shí)現(xiàn)跨站登錄重定向的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

作為 .NET 程序員,痛苦之一是自從 ASP.NET 誕生之日起直到最新的 ASP.NET Core 都無(wú)法直接實(shí)現(xiàn)跨站登錄重定向(比如訪問(wèn) https://q.cnblogs.com ,跳轉(zhuǎn)到 https://passport.cnblogs.com 進(jìn)行登錄),只能跳轉(zhuǎn)到當(dāng)前站點(diǎn)。

具體拿 ASP.NET Core 來(lái)說(shuō)就是 CookieAuthenticationOptions.LoginPath 只能指定路徑,不能指定包含主機(jī)名的完整 url ,ASP.NET Core 會(huì)在重定向時(shí)自動(dòng)加上當(dāng)前請(qǐng)求的主機(jī)名。

services.AddAuthentication()
.AddCookie(options =>
{
 options.LoginPath = "/account/signin";
});

ReturnUrl 查詢(xún)參數(shù)也只會(huì)包含路徑,不包含完整的 url 。

為了解痛,在 ASP.NET 時(shí)代我們服用的解藥要么是不用 ASP.NET 的登錄跳轉(zhuǎn)機(jī)制,要么通過(guò)專(zhuān)門(mén)的 UserController.Login Action 進(jìn)行二次跳轉(zhuǎn),在 ASP.NET Core 時(shí)代我們改服了 Middleware 的解藥,在專(zhuān)門(mén)的 Middleware 中進(jìn)行跳轉(zhuǎn)(也比較麻煩)。

昨天在閱讀了 ASP.NET Core Authenticaion 的源碼后,我們找到了一種新的解藥 —— 修改 CookieAuthenticationEvents.OnRedirectToLogin 委托實(shí)現(xiàn)跨站登錄重定向。

以下是新解藥制作方法。

在 Startup.ConfigureServices 中給 AddCookie 添加如下的配置代碼以使用修改后的 url 進(jìn)行重定向:

services.AddAuthentication()
.AddCookie(options =>
{
 var originRedirectToLogin = options.Events.OnRedirectToLogin;
 options.Events.OnRedirectToLogin = context =>
 {
  return originRedirectToLogin(RebuildRedirectUri(context));
 };
});

RebuildRedirectUri 的實(shí)現(xiàn)代碼如下:

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;
}

以上一堆代碼用于實(shí)現(xiàn) url 的轉(zhuǎn)換,詳見(jiàn)博問(wèn) https://q.cnblogs.com/q/108087/

這個(gè)長(zhǎng)久以來(lái)的痛苦總算基于 ASP.NET Core 強(qiáng)大的擴(kuò)展與配置能力相對(duì)優(yōu)雅地消除了。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論