User.Identity.i已在通用asp.net处理程序中验证使用

User.Identity.i已在通用asp.net处理程序中验证使用,asp.net,httphandler,wif,Asp.net,Httphandler,Wif,我已经使用WIF设置了一个STS,并希望公开用户是否已登录,以便RP可以确定用户是否已登录,而无需用户重定向到STS并返回。如果用户已登录,RP上将出现不同的流程,因此在流程的这一点上了解但不要强制登录很重要 我的计划是在STS上创建一个简单的通用处理程序,当通过HttpWebRequest命中该处理程序时,返回context.User.Identity.IsAuthenticated的输出(其中context是传递到ProcessRequest方法中的HttpContext: public v

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

此处理程序只会工作(返回true),如果您将STS身份验证Cookie与请求一起发送。只有您的web浏览器可能具有这些Cookie。因此,无法通过HttpWebRequest进行此操作。这也是为什么直接从浏览器调用处理程序时,此处理程序可以工作的原因。

此处理程序只能工作(返回true),如果您将STS身份验证cookies与请求一起发送。只有您的web浏览器可能有这些cookies。因此,无法通过HttpWebRequest进行此操作。这也是为什么直接从浏览器调用处理程序时,它可以工作的原因。

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

认证背后的魔力在于会话和认证cookies,它们从您的STS应用程序发送到用户的客户端(例如浏览器)。我不确定您的STS和RP应用程序是如何设计和通信的,因此我将保留通用答案。要将认证状态通知您的RP应用程序,您需要:

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

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


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

认证背后的魔力在于会话和认证cookies,它们从STS应用程序发送到用户的客户端(例如浏览器)。我不确定你的STS和RP应用程序是如何设计和沟通的,所以我会把答案保留在一般性的范围内。要将身份验证状态通知您的RP应用程序,您需要:

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

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