Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在客户httphandler程序集中使用DotNetOpenAuth作为OpenID提供程序_C#_Dotnetopenauth - Fatal编程技术网

C# 在客户httphandler程序集中使用DotNetOpenAuth作为OpenID提供程序

C# 在客户httphandler程序集中使用DotNetOpenAuth作为OpenID提供程序,c#,dotnetopenauth,C#,Dotnetopenauth,我有一个充当自定义HttpHandler的程序集(实现IHttpHandler,并在web.config中注册一个块),我希望该程序集能够提供openid提供程序功能。在查看DotNetOpenAuth示例时,我已经按照OpenIdOfflineProvider对我的处理程序进行了建模,因为这个示例(至少在其根上)是一个简单的HttpListener,代码中包含所有提供程序功能。我现在可以向依赖方(webforms示例rp)提供我的url,并查看IAAuthenticationRequest。如

我有一个充当自定义HttpHandler的程序集(实现IHttpHandler,并在web.config中注册一个块),我希望该程序集能够提供openid提供程序功能。在查看DotNetOpenAuth示例时,我已经按照OpenIdOfflineProvider对我的处理程序进行了建模,因为这个示例(至少在其根上)是一个简单的HttpListener,代码中包含所有提供程序功能。我现在可以向依赖方(webforms示例rp)提供我的url,并查看IAAuthenticationRequest。如果我将IAAuthenticationRequest.IsAuthenticated设置为true,则验证成功

然而,在设置IAuthenticationRequest.IsAuthenticated之前,我希望将用户重定向到自定义页面进行登录(因为我需要的不仅仅是简单的用户名/密码)。我尝试通过“web表单”的方式来实现这一点:

private void DoAuthentication(IAuthenticationRequest request, HttpContext context) 
{    
    if (context.Request.IsAuthenticated)
    {
        request.IsAuthenticated = true;
    }
    else
    {                
        FormsAuthentication.RedirectToLoginPage();
    }
}
这在客户端浏览器被重定向并且用户可以登录的情况下起作用,有效地设置了表单身份验证cookie,但是当登录页面执行表单身份验证。RedirectFromLoginPage()时,感觉所有上下文都丢失了(我只看到/provider页面,IAAuthenticateRequest为null)。在这一点上,正如您所期望的,有了cookie集,如果我重新向依赖方提交url,事情就会正常运行,身份验证也会成功


有没有一种方法来维护必要的上下文,以便它可以工作?还是另一种有效地要求用户在处理IAAuthenticationRequest之前点击表单页面的方法?

是的,肯定有一种方法。您只需要保留IAAuthenticationRequest的实例。您可以将其保存在内存中,也可以使用BinaryFormatter对其进行序列化,以提高可伸缩性,并在用户登录时对其进行反序列化。在ASP.NET中,此实例存储在会话字典中

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

因此,为了使这些都能正常工作,通常流程如下:

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

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

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

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

    因此,为了使这些都能正常工作,通常流程如下:

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

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

    明白了。非常感谢。关键是