背景 我的项目设置了IIS的请求头允许所有域名都可以跨域访问我的API; 但是我又想通过程序控制某些域名不能访问 Web.config代码 configuration节点下 system.webServer节点 httpProtocol customHeade
背景
我的项目设置了IIS的请求头允许所有域名都可以跨域访问我的API;
但是我又想通过程序控制某些域名不能访问
Web.config代码
<configuration>节点下 <system.webServer>节点
<httpProtocol>
<customHeaders>
<!--*代表任何人域名都可以访问-->
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="AuthToken, Authorization, Origin, Content-Type, Accept, X-Requested-With" />
<add name="Access-Control-Allow-Methods" value="GET, PATCH, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
延伸阅读:
ASP.NET MVC和ASP.NET Web API跨域请求问题解决方案【最全】
第一步:Web.config 修改
在网站根目录打开“Web.config”文件找到<appSettings>节点,
如果没有,就在<configuration>节点下加上<appSettings>节点,
下面是完整代码
<appSettings>
<!--API域名过滤-->
<add key="APICheckDomainName" value="http://192.189.1.181/,http://192.189.1.183/" />
</appSettings>
第二步:新增检查类
APICheckDomainName.cs代码
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net.Http;
using System.Web;
namespace API
{
/// <summary>
/// 检查请求API的域名是否授权,可以检测“域名”或“域名+端口”是否授权
/// </summary>
public class APICheckDomainName
{
/// <summary>
/// 检查请求的域名是否授权
/// </summary>
/// <param name="Request">当前请求</param>
/// <param name="PortCheck">是否检测端口,如果检测端口,配置文件的域名也必须附带端口号,如http://www.baidu.com:80/</param>
/// <returns>如果未授权返回false,否则true</returns>
public static bool CheckDomainName(HttpRequestMessage Request,bool PortCheck=false)
{
//RequestStatus
bool RequestStatus = false;
string RequestDomainName= string.Empty;
//获取配置
string[] APICheckDomainNameList = ConfigurationManager.AppSettings["APICheckDomainName"].ToString().Split(',');
//协议 http/htts
string scheme = string.Empty;
//域名
string host = string.Empty;
//端口
int Port= 0;
try
{
//获取请求的Scheme
scheme = Request.Headers.Referrer.Scheme;
}
catch (Exception)
{
//获取直接访问的Scheme
scheme = Request.RequestUri.Scheme;
}
try
{
//获取请求的Host
host = Request.Headers.Referrer.Host;
}
catch (Exception)
{
//获取直接访问的Host
host = Request.RequestUri.Host;
}
try
{
//获取请求的Port
Port = Request.Headers.Referrer.Port;
}
catch (Exception)
{
//获取直接访问的Port
Port = Request.RequestUri.Port;
}
if (PortCheck)
{
RequestDomainName = $"{scheme}://{host}:{Port}/";
}
else {
RequestDomainName = $"{scheme}://{host}/";
}
foreach (var item in APICheckDomainNameList)
{
if (item == RequestDomainName)
{
RequestStatus = true;
}
}
return RequestStatus;
}
}
}
第三步:调用
//检查是否授权
if (APICheckDomainName.CheckDomainName(Request)==false)
{
return "未授权!";
}