IdentityServer3 - 如果客户端在 Intranet 上,则重定向到 ADFS
IdentityServer3 - redirect to ADFS if client is on intranet
我们有一个供内部用户(员工)和外部用户(客户)使用的门户 (mvc rdp)。我们希望 IdentityServer3 自动检测身份验证请求是否是从公司网络内部完成的,并重定向到 ADFS。如果用户代理从 Internet 调用,则应显示本地登录。
简而言之,我们不希望有外部 idp 按钮,因为我们希望 IdSrv 在客户端位于内部网络上时自动重定向到 ADFS,以便为我们的域绑定用户提供真正的单点登录。
如果该门户仅供内部用户使用,那么我们只需将客户端配置为仅使用特定的身份提供者,但该门户也供外部客户使用,并且这些用户未存储在我们的 AD 中;)
我看过重写 PreAuthenticateAsync 并使用 Dns.Dns.GetHostName() 但这与 IdentityServer 运行 所在的机器有关,而不是客户端机器。
在 mvc 控制器中,我们将只使用 Request.UserHostName,但这在 IdentityServer3 UserService 中不可用。
我想你可以从OwinContext中得到客户端的IP地址;像这样:
public class UserService : UserServiceBase
{
OwinContext ctx;
public UserService(OwinEnvironmentService owinEnv)
{
ctx = new OwinContext(owinEnv.Environment);
}
public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
// The IP Address of the remote client
var ipAddress = ctx.Environment["server.RemoteIpAddress"].ToString();
if (BelongsToOurNetwork(ipAddress))
context.SignInMessage.IdP = "OurADFS";
else
context.SignInMessage.IdP = "idsrv"; // local login
return Task.FromResult(0);
}
}
我们有一个供内部用户(员工)和外部用户(客户)使用的门户 (mvc rdp)。我们希望 IdentityServer3 自动检测身份验证请求是否是从公司网络内部完成的,并重定向到 ADFS。如果用户代理从 Internet 调用,则应显示本地登录。
简而言之,我们不希望有外部 idp 按钮,因为我们希望 IdSrv 在客户端位于内部网络上时自动重定向到 ADFS,以便为我们的域绑定用户提供真正的单点登录。
如果该门户仅供内部用户使用,那么我们只需将客户端配置为仅使用特定的身份提供者,但该门户也供外部客户使用,并且这些用户未存储在我们的 AD 中;)
我看过重写 PreAuthenticateAsync 并使用 Dns.Dns.GetHostName() 但这与 IdentityServer 运行 所在的机器有关,而不是客户端机器。
在 mvc 控制器中,我们将只使用 Request.UserHostName,但这在 IdentityServer3 UserService 中不可用。
我想你可以从OwinContext中得到客户端的IP地址;像这样:
public class UserService : UserServiceBase
{
OwinContext ctx;
public UserService(OwinEnvironmentService owinEnv)
{
ctx = new OwinContext(owinEnv.Environment);
}
public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
// The IP Address of the remote client
var ipAddress = ctx.Environment["server.RemoteIpAddress"].ToString();
if (BelongsToOurNetwork(ipAddress))
context.SignInMessage.IdP = "OurADFS";
else
context.SignInMessage.IdP = "idsrv"; // local login
return Task.FromResult(0);
}
}