一.身份验证
详细请看:C# 实现身份验证之WebApi篇 - 五维思考 - 博客园 (cnblogs.com)
本人使用的是文中的第三种:Basic基础认证,在使用过程中出现了一些问题,下面对问题做一个记录
在swagger上访问需要身份验证接口,会弹出如下
这是没问题的,输入正确的用户名和密码即可正常访问接口,输入错误的密码会返回设置好的错误信息。
但是当项目发布后,如何访问呢?
二.接口调用
因为需要进行身份验证,所以我们在调用接口时需要设置请求头,添加自定义HTTP头Authorization,具体写法如下:
var authorization = "Basic " + window.btoa(encodeURI("账号:密码"));
$.ajax({
type: "POST", // 规定请求的类型(GET 或 POST), 默认为 "GET"。
// dataType: "json", // 预期服务器返回的数据类型。
url: "地址",
data: { },
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", authorization);
},
error: function(xhr, status, error) {
},
success: function(result, status, xhr) {
console.log("result:", result);
}
})
其中账号和密码为身份验证拦截器中设置的账号和密码
此时,调用Ajax会发现无法调用成功,报错信息 错误:请求的资源上不存在“Access-Control-Allow-Origin”标头等等,解决这个问题需要在配置文件中做一些设置,打开Web.Config, 在system.webServer中添加如下内容:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Access-Control-Allow-Origin, AppKey, Authorization" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
<add name="Access-Control-Request-Methods" value="GET, POST, OPTIONS" />
</customHeaders>
</httpProtocol>
配置好后重新调用接口,发现还是有错,报错信息:Access to XMLHttpRequest at 'http://localhost:4445/api/v/getmsg' from origin 'http://localhost:9528' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.原因:浏览器请求接口时会发送两个请求,一个是预请求,相当于确认请求,第二个请求才是你要发送的真正的请求,而这个错误信息说明的是第一个OPTINOS请求失败,在服务端没有处理这个method为OPTIONS的请求。所以需要在后端处理这个请求,当遇到这个请求的时候,让其通过,具体操作如下:
在项目中新建一个类库,在类库下新建一个类,让其继承IHttpModule:
//处理Ajax自定义请求头引发的错误
public class SpecialMethodModule : IHttpModule
{
public SpecialMethodModule()
{
}
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(this.BeginRequest);
}
public void Dispose()
{
}
public void BeginRequest(object resource, EventArgs e)
{
HttpApplication app = resource as HttpApplication;
HttpContext context = app.Context;
if (context.Request.HttpMethod.ToUpper() == "OPTIONS")
{
context.Response.StatusCode = 200;
context.Response.End();
}
}
}
写好之后重新生成,在这个类库的bin文件夹中找到它生成的DLL文件,复制到项目的bin文件夹下,然后在Web.config中添加配置信息,在<system.webServer>中添加模块:
<modules>
<add name="SpecialMethodModuler" type="ClassLibrary.Pipeline.SpecialMethodModule,ClassLibrary"/>
</modules>
其中 name的值可以随便写,只是为了识别,type的值由俩部分组成,逗号前(ClassLibrary.Pipeline.SpecialMethodModule)是命名空间.类名,逗号后(ClassLibrary)是程序集名称
至此完成!