我已经使用 WIF 设置了一个 STS,并希望公开用户是否已登录,以便 RP 可以确定用户是否已登录,而无需用户重定向到 STS 并返回。如果用户已登录,RP 上将发生不同的流程流,因此请务必了解,但不要在流程的此时强制登录。
我的计划是在 STS 上创建一个简单的通用处理程序,当通过 HttpWebRequest 命中时,它会返回上下文的输出。User.Identity.IsAuthentication(其中上下文是传递给 ProcessRequest 方法的 HttpContext:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
if (context.User != null && context.User.Identity.IsAuthenticated)
context.Response.Write("True");
else
context.Response.Write("False");
}
我的问题是,如果用户已登录并且我直接点击此处理程序,它将返回 True,但如果我以编程方式从 RP 命中处理程序,它将返回 False(实际上标识为空(。我这样做是完全错误的,从 RP 点击处理程序将返回 RP 上用户的状态,还是我做错了什么?
仅当您随请求一起发送 STS 身份验证 cookie 时,此处理程序才有效(返回 true(。只有您的网络浏览器才能使用这些 Cookie。因此,它不能通过HttpWebRequest来完成。这也是它工作的原因,当您直接从浏览器调用处理程序时。
这有点老了,但答案可能会帮助其他登陆此页面的人。
身份验证背后的魔力是会话和身份验证cookie,它们从您的STS应用程序发送到用户的客户端(例如浏览器(。我不确定您的 STS 和 RP 应用程序是如何设计和通信的,所以我将保持答案的通用性。若要将身份验证状态通知 RP 应用,需要:
1( 以某种方式在用户的客户端和您的 RP 应用程序之间共享两个 cookie。在这种情况下,恐怕您必须构建自己的客户端,并让用户使用它来访问 STS 应用。这是因为您无法从标准浏览器获取 Cookie。您构建的客户端将 cookie 发送到您的 RP 应用程序可以获取它们的地方,并将它们放置在 HttpWebRequest.CookieContainer 中,然后可以成功获取处理程序的结果。我只是在解释这种方法,说它是可行的,并展示它是多么复杂和扭曲。
2(或者您必须跟踪用户的登录状态。而不是检查上下文。用户,您的处理程序必须从调用 RP 应用获取用户 ID,然后检查该用户是否已登录(即该用户有一个活动会话(。例如,您可以在数据库中跟踪或存储会话,或者查看以下线程以了解访问活动会话的某些方法:
列出所有活动的 ASP.NET 会话