具有 openid 连接重定向的反向代理

L01*_*1NL 3 c# asp.net-mvc reverse-proxy openid-connect identityserver3

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

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

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

L01*_*1NL 5

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

OWIN 中间件UseOpenIdConnectAuthentication在属性Notifications中有一个Options属性。此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;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这是将 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;
}
Run Code Online (Sandbox Code Playgroud)

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