发布启用了CORS的网站

时间:2016-01-22 01:36:09

标签: asp.net asp.net-mvc-4 asp.net-web-api

我第一次潜入网站部署。我正在从客户端上的Angular控制器在web api控制器中进行跨源请求(CORS)。为了开发,我在Web Api控制器上设置了EnableCors属性,但显然,它指向我本地计算机上的站点。我试图弄清楚当我将其移动到托管生产网站时如何轻松转换该设置。

1 个答案:

答案 0 :(得分:1)

为所有域启用CORS

您的第一个选择是为所有域启用CORS。例如,如果您知道只能从预定义的网站集(例如您的Angular应用程序)访问您的API,则这可能不是最安全的选项。但在某些情况下,可以在全球范围内启用CORS。

您可以从WebApiConfig

执行此操作
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Enable CORS globally for all routes
        var enableCorsAttribute = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(enableCorsAttribute);

        // Other configurations
    }
}

或者在config中启用CORS支持,然后在特定控制器/操作上使用EnableCors属性:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.EnableCors();

        // Other configurations
    }
}

public class ValuesController : ApiController
{    
    [HttpGet]
    [Route("api/values")]
    [EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
    public string[] GetValue()
    {

    }
}

从Azure门户启用CORS

如果是Azure中的主机,我认为Web Apps现在允许您启用CORS支持并直接从Azure门户指定允许的域:

enter image description here

根据应用设置启用CORS

另一个选项是为可以从“应用程序设置”配置的域启用CORS。这样,您可以使用web.config转换,部署令牌注入或仅Azure应用程序设置更改不同API实例的允许域。这可以通过创建实现ICorsPolicyProvider interface:

的自己的属性来轻松实现
// The implementation below supports only a single origin and
// doesn't allow you to specify allowed headers or request types.
// But it can be easily extended to support these scenarios as well.
public class EnableCorsWithConfigAttribute : Attribute, ICorsPolicyProvider
{
    private readonly string configKey;

    public EnableCorsWithConfigAttribute(string configKey)
    {
        this.configKey = configKey;
    }

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, 
                                               CancellationToken cancellationToken)
    {
        var policy = new CorsPolicy
        {
            AllowAnyOrigin = false,
            AllowAnyHeader = true,
            AllowAnyMethod = true,
        };

        if (ConfigurationManager.AppSettings
                                .AllKeys
                                .Contains(configKey))
        {
            var origin = ConfigurationManager.AppSettings[configKey];
            if (!origins.IsNullOrWhitespace())
            {
                policy.AllowAnyOrigin = origins.Equals("*");
                if (!policy.AllowAnyOrigin) policy.Origins.Add(origin);
            }
        }

        return Task.FromResult(policy);
    }
}

然后您可以按如下方式使用它:

public class ValuesController : ApiController
{    
    [HttpGet]
    [Route("api/values")]
    [EnableCorsWithConfig("Application:Cors:AllowedOrigin")]
    public string[] GetValue()
    {

    }
}