2015-10-15 29 views
0

我有一个SSL证书的认证API。如果我试图通过另一个API使用SSL证书来使用它,我得到了一个错误:IIS8.5设置跨HTTPS网站之间的可用跨域

的XMLHttpRequest无法加载https://xxxx.mydomain.com/v2/auth/token。请求的资源上没有“Access-Control-Allow-Origin”标题。因此不允许访问原产地'https://yyyy.mydomain.com'。响应的HTTP状态代码为400.

我不能使用通配符。

我尝试使用,但它仅适用于HTTP工作:

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

没有人有线索?

回答

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; 
    } 
} 

唯一的选择我能想到的是做一些事情类似的URL Rewrite module

如果你想允许基于请求是否是需要认证的,而不是产地是否在某个主机命名空间中,你能做到这一点还有:

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

我忘了指定这个认证API将被我们的客户使用,我们不能完全知道调用这个API的其他域。 –

+0

所以......你不想阻止任何域名,但你不会使用通配符?你看到这可能是一个问题吗? :) –

+0

认证API将是“公开”(由我们的客户使用),所以我不明白通配符将如何解决这个问题(除了我的例子) –