ASP.NET MVC Ajax向WebAPI返回WIF sts重定向响应
我们为多个项目使用自定义的WIF 3.0 STS提供程序。 我将该身份验证集成到新的MVC 4 WebApp和WebAPI 2服务层。
如果我直接浏览到每个(WebApp和WebAPI服务),我都能够正确验证身份。 它重定向到WIF STS登录,我登录,获取ClaimsToken,然后重定向并显示预期页面。
但是,如果我已经通过身份验证,并且我的WebApp对WebAPI服务执行了jQuery.get()ajax调用,则它会反应,因为它没有ClaimsToken。 它重定向(302),我的响应头位置是STS提供者登录的位置:
https://sts-provider.my.net/?wa=wsignin1.0&wtrealm=https%3a%2f%2fwebapi.services.my.net%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fapi%252fStuff&wct = 2014-08-11T22%3A10%3a43Z&wreply = HTTPS%3A%2F%2fwebapi.services.my.net%2F
和jQuery.get()回调给我一个“错误”的textStatus。 服务没有看到ClaimsToken cookie? 请帮忙。
我不知道你想要完成什么。 可能您的整个应用程序被阻止未经授权的访问(这是WIF默认设置)。
在这种情况下,由于WIF http模块将此视为未经授权的请求并将您重定向至STS以获得授权,因此您将获得此重定向属于正常情况。 有几种方法可以解决这个问题。 首先要做的是确保你告诉asp.net你的API是“开放的”。 您可以在web.config中打开整个应用程序:
<system.web>
<authorization>
<allow users="*" />
</authorization>
然后使用[Authorize]属性关闭(需要或全部)MVC控制器。 优点是你的web api也会“打开”,因此不会做重定向。 如果你想使用WIF令牌保护你的web api,那么你需要额外的工作。 在这种情况下,您需要确保发件人以某种方式将安全令牌发送到Web api请求的标头中。 你可以编写你自己的HTTP过滤器。 我想ThinkTecture nuget已经包含了一些开箱即用的支持。
想通了,希望这可以帮助其他人。 当使用证书和ssl安全 (由于STS身份验证)进行交叉源请求时,两端都会有其他设置。 微软对此进行了简要介绍,但对于ssl(app)-to-ssl(服务)与ssl-STS-auth之间的这种实现方式还不够详细:
http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
所以我改变了我的WebApp调用jQuery.ajax()并设置这些额外的选项:
$.ajax({
url: "https://webapi.services.my.net/api/info/all",
type: 'GET',
//this tells my WebApp to send the ClaimsToken to the service call
xhrFields: { withCredentials: true },
//this tells the WebApp we're making a request against a different domain
crossDomain: true,
...
});
然后在我的WebAPI服务控制器上安装WebApi.Cors并设置为:
[EnableCors(origins: "https://webapp.my.net",
headers: "*", methods: "*")]
public class InfoController : ApiController
{
但由于某种原因,我仍然收到错误消息:
凭证标志为'true',但'Access-Control-Allow-Credentials'标头为''。 允许凭证必须是“真”。
那么,事实证明我并没有告诉我的WebAPI服务它正在接收证书。 结果是我的Web应用程序调用刚刚在302上重定向到STS,并且从来没有ClaimsToken来提供服务调用。 我的Web应用程序jQuery回调给了“错误”的textStatus和jqXHR.status为0,而不是302.我通过设置我的WebAPI服务控制器与额外的SupportsCredentials设置来解决此问题:
[EnableCors(origins: "https://webapp.my.net",
headers: "*", methods: "*", SupportsCredentials = true)]
public class InfoController : ApiController
{
繁荣。 我们在做生意。 希望这可以帮助 :)
链接地址: http://www.djcxy.com/p/12445.html上一篇: ASP.NET MVC ajax to WebAPI returning WIF sts redirect response
下一篇: Asp.net Mvc custom mechanism to handle unauthorized request