我在同一个Web服务器上有很多Web应用程序(II7): 让我们说mydomain / app1,mydomain / app2,......等等。 我试图通过OWIN添加ADFS身份验证。 这就是我所做的:
[assembly: OwinStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
public class Startup
{
private static string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
private static string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.Use((context, next) =>
{
SignIn(context);
return next.Invoke();
});
app.UseStageMarker(PipelineStage.Authenticate);
}
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
}
public void SignIn(IOwinContext context)
{
if (context.Authentication.User == null)
{
context.Authentication.Challenge(
WsFederationAuthenticationDefaults.AuthenticationType);
}
}
}
}
当用户访问mydomain / app1时,我希望他通过ADFS进行身份验证,然后重定向到mydomain / app1。对于访问mydomain / app2的用户也一样。
但是我希望在ADFS中只添加一个依赖方信任(因为有很多应用程序并且都使用相同的声明规则)。
我尝试过不同的配置,但我无法做我想做的事情:
如果RP端点是mydomain / app1 /,身份验证就可以,但所有请求(甚至从mydomain / app2重定向到app1),显然
如果RP端点只是mydomain /,我得到一个405.0 http错误 - 重定向后方法不允许(我负责斜杠)。
有关信息,我在stackoverflow上看到了这个问题: URL redirection from ADFS server
但它并没有真正回答我的问题,因为我不理解句子"(...)WIF将在URL_1处理响应,然后负责将用户重定向到URL_2& #34;在Andrew Lavers的评论中。
如何将多个端点添加到一个RP信任? 或者如何将用户重定向到原始URL? (考虑到所有应用程序都在同一个域中)。
提前感谢您的帮助。
答案 0 :(得分:3)
您应该能够根据触发身份验证流程的应用程序设置wreply参数。像这样:
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata,
Notifications = new WsFederationAuthenticationNotifications
{
RedirectToIdentityProvider = context =>
{
context.ProtocolMessage.Wreply = <construct reply URL from context.Request>;
return Task.FromResult(0);
}
}
});
答案 1 :(得分:0)
这里的问题是,即使这样做,ADFS服务器也不需要遵守给定的Wreply参数。默认情况下,ADFS成功登录后始终会重定向到Wtrealm。
在我们的案例中,我们希望通过ADFS通过2个测试服务器,1个生产服务器进行身份验证,并为开发人员启用登录(localhost)。由于重定向问题,每个服务器都需要自己的依赖方信任。
这里的理想解决方案是为运行应用程序的每个服务器单独创建RP信任,也为https://localhost:44300(Visual Studio默认SSL端口)创建RP信任,以便开发人员也可以进行身份验证。对于允许https://localhost:44300,首选选项可能存在一些安全性限制,例如在Azure VM上设置开发ADFS。