【问题标题】:Using DotNetOpenAuth as OpenID Provider in a customer httphandler assembly在客户 httphandler 程序集中使用 DotNetOpenAuth 作为 OpenID 提供程序
【发布时间】:2011-04-06 17:07:41
【问题描述】:

我有一个作为自定义 HttpHandler 的程序集(实现 IHttpHandler 并在 web.config 中注册了一个块),我想提供 openid 提供程序功能。在查看 DotNetOpenAuth 示例时,我在 OpenIdOfflineProvider 之后对我的处理程序进行了建模 - 因为此示例(至少在其根源上)是一个简单的 HttpListener,在代码中具有所有提供程序功能。我可以将我的 url 提供给依赖方(webforms 示例 rp)并查看 IAuthenticationRequest。如果我设置 IAuthenticationRequest.IsAuthenticated = true,则身份验证成功。

但是 - 在这一点上,我想在相应地设置 IAuthenticationRequest.IsAuthenticated 之前将用户重定向到自定义页面进行登录(因为我需要的不仅仅是简单的用户名/密码)。我试图用“网络表单”的方式来做到这一点:

private void DoAuthentication(IAuthenticationRequest request, HttpContext context) 
{    
    if (context.Request.IsAuthenticated)
    {
        request.IsAuthenticated = true;
    }
    else
    {                
        FormsAuthentication.RedirectToLoginPage();
    }
}

这很有效,因为客户端浏览器确实被重定向并且用户可以登录,有效地设置表单身份验证cookie,但是当登录页面执行 FormsAuthentication.RedirectFromLoginPage() 时,感觉所有上下文都丢失了(我只看到 /provider 页面和 IAuthenticateRequest 为空)。此时,如您所料,设置了 cookie 后,如果我将我的 url 重新提交给依赖方,一切正常并且身份验证成功。

有没有办法保持必要的上下文以便它可以工作?或者在处理 IAuthenticationRequest 之前有效地要求用户点击表单页面的另一种方法?

【问题讨论】:

    标签: c# dotnetopenauth


    【解决方案1】:

    是的,当然有办法。您只需要保留 IAuthenticationRequest 的实例。您可以将它保存在内存中,也可以使用 BinaryFormatter 对其进行序列化以提高可伸缩性,并在用户登录时对其进行反序列化。在 ASP.NET 中,此实例存储在 Session 字典中。

    当您使用FormsAuthentication.RedirectToLoginPage 时,它只是将 301 响应发送回客户端,并带有 ?ReturnUrl=provider.ashx 的查询字符串参数。当登录页面随后调用FormsAuthentication.RedirectFromLoginPage 时,它使用该 ReturnUrl 参数来知道将用户重定向到下一个位置。

    因此,为了使这一切正常工作,通常流程是:

    1. Provider 处理程序看到传入的身份验证请求并立即将其存储在用户会话中(如果您的处理程序中没有可用的 Session 并且不想添加它,则必须手动使用 cookie 来跟踪它) .
    2. 然后,您的 Provider 会将用户重定向到“决定”页面,该页面通常会向用户显示“您确定要登录 RP 吗?”
    3. 您的决策页面被操纵要求登录用户,因此如果该用户尚未登录,您然后致电RedirectToLoginPage。请注意,由于您是从该决策页面执行此方法,因此用户将在登录后返回此决策页面。
    4. 用户登录。登录页面调用RedirectFromLoginPage
    5. 决策页面现在可以看到登录用户,并从会话中查找IAuthenticationRequest。如果用户信任请求登录的 RP,您可以立即设置 IsAuthenticated=true 并将用户重定向回 RP。否则,决策页面将 HTML 呈现给用户以将决策呈现给用户。然后,您通过设置 IsAuthenticated=true 或 false 并将用户重定向回 RP 来响应。

    这对您如何通过自定义处理程序至少部分执行此操作有意义吗?可能只有 OP Endpoint 本身是您的自定义处理程序,而此流程(3 端)中的所有其他内容都是标准 ASPX 页面。

    【讨论】:

    • 知道了。谢谢!关键是将 IAuthenticationRequest 填充到当前会话中,然后确保所有会话都使用相同的提供者对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多