我们有一个门户网站(mvc rdp),供内部用户(员工)和外部用户(客户)使用。我们希望IdentityServer3能够自动检测身份验证请求是否在公司网络内完成,并重定向到ADFS。如果用户代理正在从Internet呼叫,则应显示本地登录。
简而言之,我们不希望拥有外部idp的按钮,因为我们希望IdSrv自动重定向到ADFS,如果客户端在内部网络上为我们的域绑定用户提供真正的单点登录。
如果门户仅供内部用户使用,那么我们只是将客户端配置为仅使用特定的身份提供者,但此门户也被外部客户使用,并且这些用户未存储在我们的AD中;)
我已经看过覆盖PreAuthenticateAsync并使用Dns.Dns.GetHostName(),但这与运行IdentityServer的计算机有关,而与客户端计算机无关。
在mvc控制器中,我们只使用Request.UserHostName,但这在IdentityServer3 UserService中不可用。
答案 0 :(得分:2)
我认为您可以从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);
}
}