ASP.NET窗体身份验证Cookie在WCF REST api方法中导致400“错误请求”错误

时间:2012-07-27 16:03:08

标签: asp.net forms-authentication

我已经在网上搜索了这个答案,虽然我发现了this one这样的问题,但我还没有找到具体的答案。

我有一个使用Forms身份验证的MVC网站提供登录支持(这基本上是MVC中的开箱即用登录支持)。

在同一个域中,我使用单一方法获得了WCF REST服务。

我要做的是看看我是否可以利用服务中的表单身份验证来查看请求者是否已经通过MVC应用程序“登录”了。在我发现的其他一些帖子之后,我确保web.config文件(w.r.t.Forms Authentication)是相同的(相同的机器密钥等)。

问题在于:我可以通过MVC站点登录(因此,通过cookie获取我的身份验证票证)。当我向我的服务发出GET请求时(请记住,在与MVC相同的域上),我可以看到“.ASPXAUTH”cookie随请求一起发送。

但是,我每次都收到“400 Bad Request”回复。此外,响应的主体表示
“服务器在处理请求时遇到错误......”

补充意见:

  • 如果我从请求中删除.ASPXAUTH cookie(例如使用Fiddler或curl),请求将毫无问题地通过
  • 我可以使用Fiddler或curl向MVC应用程序中的安全页面发送请求,并包含相同的.ASPXAUTH cookie,这可以按预期工作(响应正文中预期内容的200响应)。
  • (奇怪的是)我可以在global.asax.cs中的 Application_AcquireRequestState 方法中的服务应用程序中设置断点,并在发送请求时点击它。
    • 然后我可以检查 HttpContext.Current.User.Identity 并看到 IsAuthenticated 是真的,名称显示我的预期用户名(来自通过MVC app初始登录)
  • 我的服务方法中第一个可执行代码行中的断点永远不会被命中。

当然,当我删除.ASPXAUTH cookie时,我的服务中的两个断点都被命中(当然,在这种情况下,身份 未经过身份验证。

所以,在我看来:

  1. 表单身份验证正在运行,因为我希望它在我的服务中工作。我可以检测到请求已经过身份验证,然后他们继续查看该信息。
  2. 我在表单身份验证执行它之后崩溃并在ASP.NET管道中的某个地方刻录,但我的服务方法被调用之前
  3. 我没有找到任何类似问题的引用,并且会欣赏另一组眼睛(或几千只眼睛)来指出我希望是一个非常愚蠢而明显的答案。

    (如果有一个特定的代码区域,任何人都希望看到,我可以按要求添加。我不想进一步加重已经过度措辞的帖子,随机代码样本数量很多)

1 个答案:

答案 0 :(得分:1)

作为解决方法,问题的答案并非如此。但是,我认为这是实现基本目标的更合适的方法。

我将功能移植到基于ServiceStack的解决方案。我的猜测是冲突发生在我使用的WCF REST入门套件代码中的某处,但我没有进行详尽的分析。

无论如何,使用这种新模式完成了在MVC站点和我的服务之间利用表单身份验证的基本目标。