場景:主站 i.cnblogs.com 登入頁指向 passport.cnblogs.com/login.aspx。預設 FormsAuthentication 重導向時,ReturnUrl 僅帶相對路徑(如 /post/list),導致登入後無法正確返回原站點。
在主站建立中轉登入頁,轉址時手動組裝絕對 ReturnUrl:
return Redirect("https://passport.cnblogs.com/login.aspx?ReturnUrl="
+ HttpUtility.UrlEncode("https://" + Request.Url.Host) + ReturnUrl);
FormsAuthenticationModule.OnAuthenticate 事件可讓我們在驗證管線中修改重導向 URL。實作步驟:
IHttpModule 掛載至管線。Init 訂閱 FormsAuthenticationModule.Authenticate 事件。Response.RedirectLocation,若含 ReturnUrl 參數則替換為絕對路徑。核心程式碼概念:
void OnAuthenticate(object sender, FormsAuthenticationEventArgs e) {
var context = HttpContext.Current;
if (context.Response.RedirectLocation != null &&
context.Response.RedirectLocation.Contains(FormsAuthentication.ReturnUrlVar)) {
// 解析並重建絕對 ReturnUrl
var uriBuilder = new UriBuilder(context.Request.Url) { Path = ..., Query = ... };
context.Response.RedirectLocation = uriBuilder.Uri.AbsoluteUri;
}
}
此法集中處理,不污染業務邏輯,且支援多子域名部署。