You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中OpenIdConnect对接Azure AD SSO的登录后重定向问题

嘿,这个需求在Azure AD + OpenID Connect的场景里太常见了——本质就是要记住用户登录前想去的页面,等身份验证走完再把人送回去。我给你拆解几个关键步骤,照着做就行:

核心思路:保存并复用原始请求路径

1. 在OpenID Connect配置中自动保存原始路径

不管用户是直接访问需要授权的页面触发登录,还是点击登录按钮,我们都可以在跳转到Azure AD之前,把当前请求的路径存起来。在你的Program.cs(.NET 6+)或者Startup.cs的服务配置里,修改AddMicrosoftIdentityWebApp的配置:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        Configuration.Bind("AzureAd", options);

        // 当跳转到Azure AD登录前,保存当前请求的完整路径
        options.Events.OnRedirectToIdentityProvider = context =>
        {
            // 如果还没设置重定向地址,就用当前的请求路径+查询参数
            if (string.IsNullOrEmpty(context.Properties.RedirectUri))
            {
                context.Properties.RedirectUri = context.Request.Path + context.Request.QueryString;
            }
            return Task.CompletedTask;
        };
    });

这个OnRedirectToIdentityProvider事件会在框架准备跳转到Azure AD登录页时触发,我们在这里把用户原本要访问的页面地址塞进AuthenticationProperties的RedirectUri里,Azure AD验证通过后就会回到这个地址。

2. 自定义登录按钮时传递ReturnUrl

如果你的应用里有手动的登录按钮(不是自动触发的授权跳转),那要确保点击登录时把当前页面的路径传过去。比如在Razor视图里:

<a asp-action="Login" asp-controller="Account" asp-route-returnUrl="@Context.Request.Path">
    登录
</a>

然后在AccountController的Login方法里,把这个returnUrl设置为重定向地址,同时做一下安全校验(防止开放重定向攻击):

public IActionResult Login(string returnUrl = "/")
{
    // 验证returnUrl是否是本地路径,避免恶意跳转
    if (!Url.IsLocalUrl(returnUrl))
    {
        returnUrl = "/";
    }

    // 创建认证属性,指定登录后的重定向地址
    var authProperties = new AuthenticationProperties
    {
        RedirectUri = returnUrl
    };

    // 触发OpenID Connect认证流程
    return Challenge(authProperties, OpenIdConnectDefaults.AuthenticationScheme);
}

3. (可选)自定义回调后的重定向逻辑

默认情况下,Microsoft Identity Web库会自动处理回调后的重定向,但如果你有特殊需求(比如要对原始路径做修改),可以在OnAuthorizationCodeReceived事件里调整:

options.Events.OnAuthorizationCodeReceived = context =>
{
    // 获取之前保存的原始重定向地址
    var originalPath = context.Properties.RedirectUri;
    
    // 这里可以加自定义逻辑,比如给路径加前缀
    // context.Properties.RedirectUri = "/app" + originalPath;
    
    return Task.CompletedTask;
};

关键注意事项

  • 安全校验不能少:一定要用Url.IsLocalUrl()验证returnUrl,防止攻击者构造恶意地址跳转出去。
  • Azure AD应用注册无需添加所有页面:你只需要在Azure AD应用注册里添加框架默认的回调地址(比如https://yourdomain.com/signin-oidc)就行,不需要把每个页面都加进去——因为回调后是ASP.NET Core框架内部跳转到保存的原始路径,不是Azure AD直接跳过去。

这样应该就能完美实现用户登录后回到之前访问的页面啦!

内容的提问来源于stack exchange,提问作者Sridevi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:22