使用 openid 连接重定向的反向代理

Posted

技术标签:

【中文标题】使用 openid 连接重定向的反向代理【英文标题】:Reverse proxy with openid connect redirection 【发布时间】:2017-12-07 14:32:32 【问题描述】:

在我的应用程序中,我已将Identity server 3openid-connect 集成在一起。 在我们的生产服务器上,我们的网站位于导致问题的反向代理后面;

当用户登录并被身份服务器重定向回来时,我们的应用程序希望将用户重定向到他的原始位置(带有AuthorizeAttribute 的页面)。 这里的问题是用户被重定向到隐藏的url而不是reverse proxy使用的公共url。

如何将用户重定向到公共 url?

【问题讨论】:

【参考方案1】:

经过长时间的搜索,这是修复:

OWIN 中间件 UseOpenIdConnectAuthenticationOptions 属性中具有属性 Notifications。 这个Notifications 属性有一个func SecurityTokenValidated。在此函数中,您可以修改重定向 Uri。

app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions

    Authority = "https://idp.io",
    ClientId = "clientid",
    RedirectUri = "https://mywebsite.io",
    ResponseType = "code id_token token",
    Scope = "openid profile",
    SignInAsAuthenticationType = "Cookies",
    UseTokenLifetime = false,
    Notifications = new OpenIdConnectAuthenticationNotifications
    
        SecurityTokenValidated = notification =>
        
            notification.AuthenticationTicket.Properties.RedirectUri = RewriteToPublicOrigin(notification.AuthenticationTicket.Properties.RedirectUri);
            return Task.CompletedTask;
        
    
);

这是将 url 重写为公共来源的函数:

private static string RewriteToPublicOrigin(string originalUrl)

    var publicOrigin = ConfigurationManager.AppSettings["app:identityServer.PublicOrigin"];
    if (!string.IsNullOrEmpty(publicOrigin))
    
        var uriBuilder = new UriBuilder(originalUrl);
        var publicOriginUri = new Uri(publicOrigin);
        uriBuilder.Host = publicOriginUri.Host;
        uriBuilder.Scheme = publicOriginUri.Scheme;
        uriBuilder.Port = publicOriginUri.Port;
        var newUrl = uriBuilder.Uri.AbsoluteUri;

        return newUrl;
    

    return originalUrl;

现在OpenIdConnect 将用户重定向到公共 url 而不是非公共网络服务器 url。

【讨论】:

以上是关于使用 openid 连接重定向的反向代理的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 反向代理重定向到帐户/登录

在网站前面使用反向代理将 http 请求从 iframe 中重定向到网站

反向代理将 url 重定向到子域

nginx应用 | 反向代理,统一鉴权,目录重定向

使用 Apache ProxyPass 的反向代理重定向而不是透明地通过

如何使用反向代理处理 Express 应用程序中的重定向