IIS8.5在HTTPS网站之间设置跨域

时间:2015-10-15 14:55:52

标签: .net api ssl iis-8.5

我已经获得了使用SSL证书进行身份验证的API。如果我尝试通过另一个带有SSL证书的API使用它,我会收到错误:

  

XMLHttpRequest无法加载https://xxxx.mydomain.com/v2/auth/token。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' https://yyyy.mydomain.com'因此不允许访问。响应的HTTP状态代码为400。

我不能使用通配符。

我尝试使用它,但它只适用于HTTP:

<httpProtocol>
    <customHeaders>
        <clear />           
        <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
</httpProtocol>

有没有人有线索?

1 个答案:

答案 0 :(得分:0)

由于每个响应只能允许一个原始条目,因此您需要检查飞行前请求中的Origin标题,看看是否要允许它,然后编写相应地Access-Control-Allow-Origin标头值。

IIS 7.0+中最简单的方法可能是编写自定义处理程序并注册它以处理对/v2/auth/ uri路径的OPTIONS请求。

我暂时没有编写IIS扩展,所以这是在同一命名空间(Origin)内允许任何mydomain.com的粗略尝试:

public class MultipleOriginHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext ctx)
    { 
        Uri origin;
        if(String.Compare(ctx.Request.HttpMethod,"OPTIONS",true) != 0)
            return; // not an OPTIONS request, 

        if(!Uri.TryCreate(ctx.Request.Headers.Get("Origin"), UriKind.RelativeOrAbsolute, out origin))
            return; // failed to extract Origin URI

        if(origin.Host.EndsWith(".mydomain.com") || origin.Host == "mydomain.com"){
            // Request came from one of our own sites, let's allow it 
            ctx.Response.AppendHeader("Access-Control-Allow-Origin",String.Format("{0}://{1}",origin.Scheme,origin.Host));
        }
        return;
    }
}

我能想到的唯一选择是使用enter image description here

做类似的事情

如果您希望根据是否经过身份验证来允许请求,而不是根据某个主机命名空间是否属于某个主机命名空间,那么您也可以这样做:

if(ctx.User.Identity.IsAuthenticated){
    // Request was authenticated 
    ctx.Response.AppendHeader("Access-Control-Allow-Origin",String.Format("{0}://{1}",origin.Scheme,origin.Host));
}