我已经设置了一个带有WIF的STS,并希望公开用户是否已登录,以便RP可以确定用户是否已登录而无需用户重定向到STS并返回。如果用户已登录,则RP上将出现不同的流程,因此了解但不要在此过程中强制登录这一点非常重要。
我的计划是在STS上创建一个简单的通用处理程序,当通过HttpWebRequest命中时,返回context.User.Identity.IsAuthenticated的输出(其中context是传递给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(实际上Identity为null)。 我这样做完全错了,从RP中命中处理程序会返回RP上的用户状态,还是我做错了什么?
答案 0 :(得分:0)
如果您使用请求发送STS身份验证Cookie,此处理程序将仅起作用(返回true)。只有您的网络浏览器可能包含这些cookie。因此无法通过HttpWebRequest完成。当你直接从浏览器调用处理程序时,这就是它的工作原理。
答案 1 :(得分:0)
我知道这有点旧帖,但答案可能会帮助其他人登陆此页。
在身份验证背后发挥作用的是会话和身份验证Cookie,它们将从您的STS应用程序发送到用户的客户端(例如浏览器)。我不确定您的STS和RP应用程序是如何设计和通信的,所以我会保持答案的通用性。要通知您的RP应用程序身份验证状态,您需要:
1)以某种方式在用户的客户端和您的RP应用程序之间共享cookie。在这种情况下,我担心您必须构建自己的客户端并让您的用户使用它来访问STS应用程序。这是因为您无法从标准浏览器中获取Cookie。您构建的客户端将cookie发送到RP应用程序可以获取它们的位置,并将它们放在HttpWebRequest.CookieContainer中,然后可以成功获取处理程序的结果。我只是解释这种方法,说它是可行的,并显示它是多么复杂和扭曲。
2)或者您必须跟踪用户的登录状态。您的处理程序必须从调用RP应用程序获取用户ID,然后检查该用户是否已登录(即该用户是否存在活动会话),而不是检查context.User。例如,您可以在数据库中跟踪或存储会话,或者查看以下线程以获取访问活动会话的一些方法: