我已经在网上搜索了这个问题的答案,虽然我发现了类似的问题,但我还没有找到具体的答案。
我有一个 MVC 网站,它使用 Forms Authentication 来提供登录支持(这基本上是 MVC 中开箱即用的登录支持)。
在同一个域中,我有一个使用单一方法的 WCF REST 服务。
我想要做的是看看我是否可以从服务中利用表单身份验证来查看请求者是否已经通过 MVC 应用程序“登录”。在我发现的其他一些帖子之后,我确保 web.config 文件(wrt 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为真,并且Name显示我的预期用户名(通过 MVC 应用程序的初始登录)
- 我的服务方法中的第一个可执行代码行中的断点永远不会被命中。
当然,当我删除 .ASPXAUTH cookie 时,我的服务中的两个断点都会被命中(当然,在这种情况下,身份没有经过身份验证。
所以,在我看来:
- 表单身份验证工作正常,我希望它在我的服务中工作。我可以检测到请求已通过身份验证,并且他们继续使用该信息。
- 在Forms Authentication 完成它的事情之后但在我的服务方法被调用之前,我在 ASP.NET 管道中的某个地方崩溃并烧毁。
我没有运气找到任何对类似问题的引用,并且希望有另一双眼睛(或几千双眼睛)来指出我希望是一个非常愚蠢和明显的答案。
(如果有人想查看特定区域的代码,我可以按要求添加。我不想用大量随机代码示例进一步加重已经措辞过度的帖子的负担)