asp.net-mvc - 表单例份验证、ASP.NET MVC 和 WCF RESTful 服务

标签 asp.net-mvc wcf jquery restful-authentication

一个测试网络服务器,具有以下应用程序

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 绑定(bind)配置中,FormsAuth 示例没有显式 <bindings>元素,但我添加了这个:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
        <baseAddressPrefixFilters>
            <add prefix="http://service.ganymedes.com:8008" />
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>    
</system.serviceModel>

否则服务根本不会绑定(bind)。我可以使用与直接在浏览器中的 jQuery 调用中使用的相同的数据 URI,它将发送 cookie,WCF 将返回数据。我似乎无法在跨子域调用中使用它并包含身份验证 cookie。

最佳答案

好的,我想这是由于安全原因(同源策略)而导致的已知限制。我了解跨域阻止,但我认为这对于子域来说没问题。

我花了大约 2 周的时间研究 WCF 和 REST(并使用 MVC 作为 RESTful Web 服务),始终以 AJAX 感知的心态进行研究,而这在概念验证实现之前从未出现过。去搞清楚。

显然基本身份验证也无法通过 AJAX 跨子域工作。 JSONP 似乎可以与表单例份验证/cookie 一起使用,但不能与基本身份验证一起使用(无论如何我不想将自己限制为 HTTP GET...)。更改 document.domain 对我来说并没有占用。

我想我必须将所有内容放在同一个域中,或者手动发送身份验证信息作为每次调用的请求参数,但这两种解决方案都感觉像是蹩脚的解决方法(而且它肯定也不是更安全)。那好吧。

我现在感觉自己有点傻

关于asp.net-mvc - 表单例份验证、ASP.NET MVC 和 WCF RESTful 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2897392/

相关文章:

asp.net - 用于 POST 和返回 (GET) 的 REST uri

jquery - 联系表单 7 Ajax/jquery 触发器无效 - 未触发

asp.net-mvc - MVC View 模型构造函数

c# - 在 GridView asp.net 中删除标题样式 css 类

json - 通过装饰覆盖一个特定枚举的全局 Json.NET 枚举处理

c# - 构建Azure云服务失败

c# - System.Core 未添加到对程序集的引用

wcf - 使用 Nunit 测试 WCF 方法,但 WebOperationContext 为 null

jquery 与 videobox 和自定义代码冲突

jquery - Ajax json响应在POST方法中没有成功