【问题标题】:User.Identity.IsAuthenticated use in generic asp.net handlerUser.Identity.IsAuthenticated 在通用 asp.net 处理程序中的使用
【发布时间】:2014-01-21 00:38:13
【问题描述】:

我已经使用 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 上用户的状态,还是我做错了什么?

【问题讨论】:

    标签: asp.net httphandler wif


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      List all active ASP.NET Sessions

      【讨论】:

        猜你喜欢
        • 2014-08-30
        • 1970-01-01
        • 2011-03-04
        • 2013-06-12
        • 2010-10-12
        • 2016-11-14
        • 2012-10-17
        • 2012-07-18
        • 2011-06-20
        相关资源
        最近更新 更多