表单身份验证、ASP.NET MVC 和 WCF RESTful 服务
Posted
技术标签:
【中文标题】表单身份验证、ASP.NET MVC 和 WCF RESTful 服务【英文标题】:Forms authentication, ASP.NET MVC and WCF RESTful service 【发布时间】:2011-02-23 06:05:07 【问题描述】:一个测试网络服务器,带有以下应用程序
service.ganymedes.com:8008 - WCF RESTful 服务,基本上是 WCF Starter Kit Preview 2 中的 FormsAuth 示例
mvc.ganymedes.com:8008 - ASP.NET MVC 2.0 应用程序
service.ganymedes.com 的 web.config:
<authentication mode="Forms">
<forms loginUrl="~/login.aspx" timeout="2880" domain="ganymedes.com" name="GANYMEDES_COOKIE" path="/" />
</authentication>
mvc.ganymedes.com 的 web.config:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" domain="ganymedes.com" name="GANYMEDES_COOKIE" path="/" />
</authentication>
尽我所能,通过 jQuery 的 $.ajax 或 getJson 的 GET(或 POST)不会发送我的 cookie(根据 Firebug),所以我从 WCF 服务返回 HTTP 302:
Request Headers
Host service.ganymedes.com:8008
User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)
Accept application/json, text/javascript, */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Referer http://mvc.ganymedes.com:8008/Test
Origin http://mvc.ganymedes.com:8008
它是在 MVC 网站上闲逛时发送的:
Request Headers
Host mvc.ganymedes.com:8008
User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Referer http://mvc.ganymedes.com:8008/Test
Cookie GANYMEDES_COOKIE=0106A4A666C8C615FBFA9811E9A6C5219C277D625C04E54122D881A601CD0E00C10AF481CB21FAED544FAF4E9B50C59CDE2385644BBF01DDD4F211FE7EE8FAC2; GANYMEDES_COOKIE=D6569887B7C5B67EFE09079DD59A07A98311D7879817C382D79947AE62B5508008C2B2D2112DCFCE5B8D4C61D45A109E61BBA637FD30315C2D8353E8DDFD4309
我还在两个应用程序的 web.config 文件中放置了完全相同的设置(自行生成的validationKey 和decryptionKey)。
在 WCF 绑定配置中,FormsAuth 示例没有明确的 <bindings>
元素,但我添加了这个:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://service.ganymedes.com:8008" />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
</system.serviceModel>
或者服务根本不会绑定。我可以直接在浏览器中使用与在 jQuery 调用中使用的相同的数据 URI,它将发送 cookie,而 WCF 将返回数据。我似乎无法在跨子域调用中使用它并包含身份验证 cookie。
【问题讨论】:
你能发布你的 wcf 绑定配置吗 【参考方案1】:好的,我想这是一个已知的安全限制(同源策略)。我知道跨域块,但我认为它可以用于子域。
我花了大约 2 周的时间研究 WCF 和 REST(以及将 MVC 用作 RESTful Web 服务),始终以 AJAX 感知的心态进行研究,而这在概念验证实施之前从未出现过。去搞清楚。
显然,基本身份验证也无法通过 AJAX 跨子域工作。 JSONP 似乎可以与表单身份验证/cookies 一起使用,但不能与基本身份验证一起使用(我不想将自己限制在 HTTP GET 上……)。更改 document.domain 并没有为我做蹲。
我想我毕竟必须将所有内容放在同一个域中,或者手动发送身份验证信息作为每次调用的请求参数,但是这两种解决方案都感觉像是糟糕的解决方法(而且它肯定也不是更安全)。那好吧。
我现在觉得有点傻。
【讨论】:
以上是关于表单身份验证、ASP.NET MVC 和 WCF RESTful 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.Net MVC 应用程序中使用来自 WCF 身份验证服务的身份验证 cookie
ASP.NET MVC 表单身份验证 + 授权属性 + 简单角色
我应该如何处理 Window Phone / WCF / ASP.NET MVC 应用程序的用户身份?
将 asp.net WebForms 应用程序中的组合表单/Windows 身份验证迁移到 asp.net MVC 应用程序