【问题标题】:Reverse proxy with openid connect redirection使用 openid 连接重定向的反向代理
【发布时间】:2017-12-07 14:32:32
【问题描述】:
在我的应用程序中,我已将Identity server 3 与openid-connect 集成在一起。
在我们的生产服务器上,我们的网站位于导致问题的反向代理后面;
当用户登录并被身份服务器重定向回来时,我们的应用程序希望将用户重定向到他的原始位置(带有AuthorizeAttribute 的页面)。
这里的问题是用户被重定向到隐藏的url而不是reverse proxy使用的公共url。
如何将用户重定向到公共 url?
【问题讨论】:
标签:
c#
asp.net-mvc
reverse-proxy
identityserver3
openid-connect
【解决方案1】:
经过长时间的搜索,这是修复:
OWIN 中间件 UseOpenIdConnectAuthentication 在 Options 属性中具有属性 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。