• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NETMVCWebAPI从入门到精通(三)–客户端或者服务端的安全控制 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

要想解决第二个问题就没这么容易了,我们需要更深入的理解WebAPI的工作方式。
其实对于WebAPI来说,它最初被设计为和WCF一样的:客户端、服务端两套结构,我们到现在之所以还没有提到客户端,是因为我们的请求别的方式来封装成HTTP请求或接收HTTP相应的,比如AJAX和Form表单提交。
在这里先给出一个服务端的响应工作流,让大家有个大体上的认识
大 家可以看到,HTTP的请求最先是被传递到HOST中的,如果WebAPI是被寄宿在IIS上的,这个HOST就是IIS上,HOST是没有能力也没有必 要进行请求的处理的,请求通过HOST被转发给了HttPServer此时已经进入WebAPI的处理加工范围,HttpServer是System.Net.HTTP中的一个类,通过HttpServer,请求被封装成了WebAPI中的请求承载 类:HttpRequestMessage,这个封装后的请求可以经过一系列自定义的Handler来处理,这些handler串联成一个pipeline,最后请求会被传递给HttpControlDispather,这个类通过对路由表的检索来确定请求将被转发到的具体的Controller中的Action。

在客户端,Handlers pipeline最终是被传递到HttpClientHandler上的,由他负责HttpRequestMessage到HTTP请求的转换。

这里只说明一下Request,Response与其类似。

(四)解决第二个问题

由 此我们早就可以看出,想要解决第二个问题,可以直接在Handler PipeLine中进行,这种AOP风格的过滤器(拦截器)在REST的Webservice的安全验证中应用很广,一般大家比较乐于在HTTP头或者在HTTP请求的URL中加上身份验证字段进行身份验证,下面举一个在Http头中添加身份验证信息的小例子

4.1客户端
客户端的customhandler用于将身份验证信息添加入报头

 

class RequestUpHandler : DelegatingHandler

    {

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)

        {

            request.Headers.Add("key", "11234");

return base.SendAsync(request, cancellationToken);

        }

    }

 

注:
1.customhandler继承自DelegatingHandler类,上面已经说过,WebAPI的客户端和服务端被设计为相互对应的两套结构,所以不论是在客户端还是服务端,customhandler都是继承自DelegatingHandler类
2.DelegatingHandler的sendAsync方法便是处理请求和接受请求时会被调用的方法,该方法返回值是HttPResponseMessage,接收的值为HttpRequestMessage,符合我们的一般认知
3.方法的最后,调用base.SendAsync是将Request继续向该pipeline的其他customHandler传递,并获取其返回值。由于该方法不包含Response的处理逻辑,只需直接将上一个CustomHandler的
返回值直接返回
客户端主程序

 

static void Main(string[] args)

        {

            HttpClient client = new HttpClient(new RequestUpHandler() { InnerHandler = new HttpClientHandler() });

            HttpResponseMessage response = client.GetAsync("http://localhost:60023/api/FormSubmit").Result;

            response.Content.ReadAsAsync<string>().ContinueWith((str) => { Console.WriteLine(str.Result); });

            Console.Read();

        }

 

客 户端的主程序创建了一个HttpClient,HttpClient可以接受一个参数,该参数就是CustomHandler,此处我们嵌入了我们定义的 RequestUpHandler,用于对Request报头进行嵌入身份验证码的处理,CustomHandler通过InnerHandler属性嵌 入其内置的下一个CustomHandler,此处,由于没有下一个CustomerHandler,我们直接嵌入HttpClientHandler用 于将HttpRequestMessage转化为HTTP 请求、将HTTP响应转化为HttpResponseMessage

4.2服务端
服务端的customHandler用于解析HTTP报头中的身份认证码

 

protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)

        {

int matchHeaderCount = request.Headers.Count((item) =>

            {

if ("key".Equals(item.Key))

                {

foreach (var str in item.Value)

                    {

if ("11234".Equals(str))

                        {

return true;

                        }

                    }

                }

return false;

            });

if (matchHeaderCount>0)

            {

return base.SendAsync(request, cancellationToken);

            }

return Task.Factory.StartNew<HttpResponseMessage>(() => { return new HttpResponseMessage(HttpStatusCode.Forbidden); });

        }

 

注:代码的处理逻辑很简单:如果身份验证码匹配成功,则通过base.SendAsync继续将请求向下传递,否则返回直接中断请求的传递,直接返回一个响应码为403的响应,指示没有权限。
注意由于SendAsync的返回值需要封装在Task之中,所以需要使用Task.Factory.StartNew将返回值包含在Task中

将customHandler注入到HOST中
本例中WebAPI HOST在IIS上,所以我们只需将我们定义的CustomHandler在Application_Start中定义即可

 

protected void Application_Start()

        {

//省略其他逻辑代码

            GlobalConfiguration.Configuration.MessageHandlers.Add(new HttpUrlHandler());

        }

 

由于WebAPI Host在IIS上,所以HttpServer和HttpControllerDispatcher不用我们手工处理

在加上上面的处理后,如果没有身份验证码的请求,会得到如下的响应

Fobbiden 403


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap