WebApi身份验证与接口调用

一.身份验证

详细请看: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)是程序集名称

至此完成!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值