ASP.NET Core MVC如何将未认证用户重定向至外部SSO站点?
解决ASP.NET Core MVC重定向至外部SSO站点的问题
因为LoginPath要求必须是本地路径(以"/"开头),不能直接设置为外部URL,所以可以通过两种方式实现跳转至外部SSO站点:
方法一:本地Login Action中转
1. 配置认证的LoginPath为本地路径
修改认证配置,将LoginPath设为本地路由:
using Microsoft.AspNetCore.Authentication.Cookies; builder.Services .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Account/Login"; // 本地中转路径 // 补充SSO共享Cookie的必要配置,比如: // options.Cookie.Domain = ".company.com"; // 跨子域名共享Cookie // options.Cookie.Name = "SharedAuthCookie"; // 统一Cookie名称 });
2. 创建中转Login Action
在AccountController中添加Action,负责重定向到SSO站点并携带返回URL:
public class AccountController : Controller { public IActionResult Login(string returnUrl) { // 验证返回URL的安全性,防止开放重定向攻击 if (!Url.IsLocalUrl(returnUrl)) { returnUrl = "/"; // 设为站点默认首页 } // 构造SSO登录地址,转义返回URL避免编码问题 var ssoLoginUrl = $"https://sso.company.com/account/login?returnUrl={Uri.EscapeDataString(returnUrl)}"; return Redirect(ssoLoginUrl); } }
当未认证用户访问需要授权的页面时,会先跳转到本地/Account/Login,再自动重定向到SSO登录页,同时携带原请求的返回地址。
方法二:自定义AuthenticationEvents事件
无需额外创建Controller Action,直接在认证配置中通过OnRedirectToLogin事件修改重定向地址:
using Microsoft.AspNetCore.Authentication.Cookies; builder.Services .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Events = new CookieAuthenticationEvents { OnRedirectToLogin = context => { string returnUrl = context.RedirectUri; // 验证返回URL的合法性 if (!context.Request.IsLocalUrl(returnUrl)) { returnUrl = "/"; } // 构造SSO登录地址并执行重定向 var ssoLoginUrl = $"https://sso.company.com/account/login?returnUrl={Uri.EscapeDataString(returnUrl)}"; context.Response.Redirect(ssoLoginUrl); return Task.CompletedTask; } }; // 补充SSO共享Cookie的配置 // options.Cookie.Domain = ".company.com"; // options.Cookie.Name = "SharedAuthCookie"; });
关键注意事项
- 共享Cookie配置:确保应用站点和SSO站点使用相同的Cookie名称、域名,并且数据保护配置一致(比如共享密钥存储),这样登录后的Cookie才能在多个站点间生效。
- 返回URL安全:必须验证返回URL是否属于当前站点,避免恶意跳转风险,上述两种方法中都加入了安全验证逻辑。
内容的提问来源于stack exchange,提问作者PedroAsking
相关产品推荐
相关产品推荐

