4

我们有很多域在一个 IIS 网站/应用程序池上运行。现在,我们正在使用 Windows Identity Foundation 实施 SSO。

在 web.config 中,必须设置领域

<wsFederation passiveRedirectEnabled="true" issuer="http://issuer.com" realm="http://realm.com" requireHttps="false" />

我的问题是领域取决于用户访问网站的域,所以我所做的就是将它设置在这样的全局操作过滤器中

var module = context.HttpContext.ApplicationInstance.Modules["WSFederationAuthenticationModule"] as WSFederationAuthenticationModule;
module.Realm = "http://" + siteInfo.DomainName;

我的问题是。当我像这样设置领域时,它是按用户实例还是应用程序实例设置的。

设想。

用户 A 加载页面并且领域设置为 domain.a.com。

用户 B 已经在 domain.b.com 上登录并按下登录。

由于用户 A 在用户 B 按下登录之前加载了该页面,因此用户 A 将使用错误的领域设置访问 STS。

这里会发生什么?

如果这不是为每个用户实例设置领域的方法,还有其他方法吗?

4

1 回答 1

4

我已经解决了这个问题。

我在 web.config 中将 PassiveRedirectEnabled 设置为 false

我将 mvc 项目设置为使用表单身份验证,尽管我没有。我这样做是为了每次运行带有 [Authorize] 的控制器时,我都会使用返回 url 重定向到我的登录控制器。

在我的登录控制器中,我做

var module = HttpContext.ApplicationInstance.Modules["WSFederationAuthenticationModule"] as WSFederationAuthenticationModule;
module.PassiveRedirectEnabled = true;

SignInRequestMessage mess = module.CreateSignInRequest("passive", returnUrl, false);
mess.Realm = "http://" + Request.Url.Host.ToLower();

HttpContext.Response.Redirect(mess.WriteQueryString());

这绝对不是它应该的样子,对我来说,感觉 Windows Identity Foundation 在文档和微软技术方面都落后了,没有 MVC 的例子。

对于其他 MVC 人员,我建议他们不要使用 fedutil 向导,而是自己编写代码和配置

于 2010-11-16T15:29:29.987 回答