C# 在客户httphandler程序集中使用DotNetOpenAuth作为OpenID提供程序
我有一个充当自定义HttpHandler的程序集(实现IHttpHandler,并在web.config中注册一个块),我希望该程序集能够提供openid提供程序功能。在查看DotNetOpenAuth示例时,我已经按照OpenIdOfflineProvider对我的处理程序进行了建模,因为这个示例(至少在其根上)是一个简单的HttpListener,代码中包含所有提供程序功能。我现在可以向依赖方(webforms示例rp)提供我的url,并查看IAAuthenticationRequest。如果我将IAAuthenticationRequest.IsAuthenticated设置为true,则验证成功 然而,在设置IAuthenticationRequest.IsAuthenticated之前,我希望将用户重定向到自定义页面进行登录(因为我需要的不仅仅是简单的用户名/密码)。我尝试通过“web表单”的方式来实现这一点:C# 在客户httphandler程序集中使用DotNetOpenAuth作为OpenID提供程序,c#,dotnetopenauth,C#,Dotnetopenauth,我有一个充当自定义HttpHandler的程序集(实现IHttpHandler,并在web.config中注册一个块),我希望该程序集能够提供openid提供程序功能。在查看DotNetOpenAuth示例时,我已经按照OpenIdOfflineProvider对我的处理程序进行了建模,因为这个示例(至少在其根上)是一个简单的HttpListener,代码中包含所有提供程序功能。我现在可以向依赖方(webforms示例rp)提供我的url,并查看IAAuthenticationRequest。如
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参数来知道将用户重定向到下一个位置
因此,为了使这些都能正常工作,通常流程如下:
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参数来知道将用户重定向到下一个位置
因此,为了使这些都能正常工作,通常流程如下:
RedirectToLoginPage
。请注意,由于您从该决策页面执行了此方法,因此用户在登录后将返回到此决策页面重定向fromLoginPage
iaauthenticationrequest
。如果用户信任请求登录的RP,您可以立即设置IsAuthenticated=true并将用户重定向回RP。否则,决策页面将向用户呈现HTML以向用户呈现决策。然后通过设置IsAuthenticated=true或false并将用户重定向回RP来响应该请求对于如何从自定义处理程序中至少部分地执行此操作,这有意义吗?可能只有OP端点本身才是您的自定义处理程序,此流中的所有其他内容(3端)都将是标准的ASPX页面。明白了。非常感谢。关键是