我已经获得了使用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>
有没有人有线索?
答案 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;
}
}
做类似的事情
如果您希望根据是否经过身份验证来允许请求,而不是根据某个主机命名空间是否属于某个主机命名空间,那么您也可以这样做:
if(ctx.User.Identity.IsAuthenticated){
// Request was authenticated
ctx.Response.AppendHeader("Access-Control-Allow-Origin",String.Format("{0}://{1}",origin.Scheme,origin.Host));
}