2

我已经使用 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 为空)。我这样做是完全错误的吗?从 RP 中点击处理程序将返回 RP 上用户的状态,还是我做错了什么?

4

2 回答 2

0

此处理程序仅在您随请求发送 STS 身份验证 cookie 时才有效(返回 true)。只有您的网络浏览器可能有这些 cookie。因此它不能通过 HttpWebRequest 来完成。当您直接从浏览器调用处理程序时,这也是它起作用的原因。

于 2012-10-18T09:49:34.970 回答
0

我知道这是一个有点旧的线程,但答案可能会帮助其他登陆此页面的人。

身份验证背后的神奇之处在于会话和身份验证 cookie,它们从您的 STS 应用程序发送到用户的客户端(例如浏览器)。我不确定您的 STS 和 RP 应用程序是如何设计和通信的,所以我将保持通用的答案。要将身份验证状态通知您的 RP 应用程序,您需要:

1)要么以某种方式在用户的客户端和您的 RP 应用程序之间共享 cookie。在这种情况下,恐怕您将不得不构建自己的客户端并让您的用户使用它来访问 STS 应用程序。这是因为您无法从标准浏览器获取 cookie。您构建的客户端将 cookie 发送到您的 RP 应用程序可以获取它们的地方,并将它们放置在 HttpWebRequest.CookieContainer 中,然后可以成功获取处理程序的结果。我只是解释这种方法是说它是可行的,并说明它是多么复杂和扭曲。

2) 否则您将不得不跟踪用户的登录状态。您的处理程序必须从调用 RP 应用程序获取用户 ID,然后检查该用户是否已登录(即该用户有一个活动会话),而不是检查 context.User。例如,您可以在数据库中跟踪或存储会话,或者查看以下线程以了解访问活动会话的一些方法:

列出所有活动的 ASP.NET 会话

于 2014-01-20T16:38:13.757 回答