2012-05-09 29 views
2

我已经设置了一个带WIF的STS,并且想要公开用户是否登录,以便RP可以确定用户是否登录而不需要用户重定向到STS并返回。如果用户已登录,则RP上将出现不同的流程流,因此在此过程中知道但不强制登录是很重要的。User.Identity.IsAuthenticated在通用的asp.net处理程序中使用

我的计划是在其上创建STS其中,经由HttpWebRequest的击打时,返回context.User.Identity.IsAuthenticated(的输出的简单的通用处理程序,其中上下文是传递到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上的用户的状态或可我做错了什么?

回答

1

该处理器将只工作(返回true),如果你发送请求的STS身份验证Cookie。只有您的网络浏览器可能有这些cookie。因此它不能通过HttpWebRequest完成。当你直接从浏览器调用处理程序时,这也是它工作的原因。

0

我知道这有点旧线程,但答案可能有助于其他人登陆此页面。

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

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

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

List all active ASP.NET Sessions

相关问题