Restful风格wcf调用4——权限认证

Posted jeely

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Restful风格wcf调用4——权限认证相关的知识,希望对你有一定的参考价值。

写在前面

在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作。本篇文章将介绍一下,调用restful的权限认证的内容。在调用的接口,为了安全,总会需要对请求进行权限认证的。以防一些非法的操作。

系列文章

Restful风格wcf调用

Restful风格wcf调用2——增删改查

Restful风格wcf调用3——Stream

一个例子

在REST WCF中,我们可以利用 HttpHeader 来完成这一目标。

首先我们添加一个校验身份的一个方法。

技术图片
        /// <summary>
        /// 校验是否有权限访问
        /// </summary>
        /// <returns></returns>
        private bool CheckIsCheckAuthorization()
        
            //获得当前web操作上下文
            WebOperationContext woc = WebOperationContext.Current;
            //获得当前请求头中的Authorization
            var auth = woc.IncomingRequest.Headers[System.Net.HttpRequestHeader.Authorization];
            //如果auth为空,或者不等于admin/123,则响应405 MethodNotAllowed 
            if (string.IsNullOrEmpty(auth) || auth != "admin/123")
            
                woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.MethodNotAllowed;
                return false;
            
            return true;

        
技术图片

 然后,在每个接口中,加上权限认证的语句。

技术图片
        /// <summary>
        /// 获得所有的用户信息
        /// </summary>
        /// <returns>json或者xml</returns>
        public List<UserInfo> QueryList()
        
            if (CheckIsCheckAuthorization())
            
                return new List<UserInfo>() 
                 
                    new UserInfo()  ID = 1, Name = "wofly", Age = 22, Birthday = DateTime.Now, Gender = true , 
                    new UserInfo()  ID = 2, Name = "san zhang", Age = 21, Birthday = DateTime.Now, Gender = true , 
                    new UserInfo()  ID = 3, Name = "wukong sun", Age = 23, Birthday = DateTime.Now, Gender = false , 
                    new UserInfo()  ID = 4, Name = "zi ma", Age = 45, Birthday = DateTime.Now, Gender = true 
                 ;
            
            else
            
                return null;
            
        
技术图片

在浏览器中浏览,http://localhost:21074/userInfo/api/users
技术图片

我们现在使用postman模拟请求,进行验证,如图所示:
技术图片

这样,就对可以控制对接口的访问,只有有权限的用户才可以访问。但是,问题来了,有那么多的方法,每个方法都要加上那么一句权限的认证,看起来相当的繁琐。这里介绍一种高大上的方式。通过在WebServiceHostFactory中的拦截请求上下文中Authorization可以做到。

技术图片
    public class SecureWebServiceHostFactory : System.ServiceModel.Activation.WebServiceHostFactory
    
        public override System.ServiceModel.ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
        
            var host= base.CreateServiceHost(constructorString, baseAddresses);
            //在这里,拦截验证
            host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();  
            return host;
        
        protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        
            var host = base.CreateServiceHost(serviceType, baseAddresses);
            //在这里,拦截验证
            host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
            return host;
        
    
    /// <summary>
    /// 自定义验证方式
    /// </summary>
    public class MyServiceAuthorizationManager : ServiceAuthorizationManager
    
        protected override bool CheckAccessCore(OperationContext operationContext)
        
            var woc = System.ServiceModel.Web.WebOperationContext.Current;
            var auth = woc.IncomingRequest.Headers[HttpRequestHeader.Authorization];
            if (string.IsNullOrEmpty(auth) || auth != "admin/123")
            
                woc.OutgoingResponse.StatusCode = HttpStatusCode.MethodNotAllowed;
                return false;
            
            return true;
        
    
技术图片

然后,在注册路由的时候,做一下修改:

技术图片
    public class Global : System.Web.HttpApplication
    
        protected void Application_Start(object sender, EventArgs e)
        
            //注册路由
            System.Web.Routing.RouteTable.Routes.Add(
                new System.ServiceModel.Activation.ServiceRoute(
                    "userInfo",
                    new SecureWebServiceHostFactory(), typeof(UserService)
                ));
            //注册路由
            System.Web.Routing.RouteTable.Routes.Add(new System.ServiceModel.Activation.ServiceRoute(
                "imageService", new System.ServiceModel.Activation.WebServiceHostFactory(), typeof(ImageService)));
        
    
技术图片

上面代码中,红色的部分,就是自定义的认证的类。
现在我们使用postman模拟请求,进行一下验证,

技术图片

技术图片

总结

好了,关于restful风格wcf的使用方式,就介绍到这里,希望对你有所帮助。

参考文章:

http://blog.csdn.net/fangxing80/article/details/6263780

以上是关于Restful风格wcf调用4——权限认证的主要内容,如果未能解决你的问题,请参考以下文章

Restful安全认证及权限的解决方案

restful:认证权限频率

Drf04 / drf request请求对象封装版本认证权限

WCF权限控制

Drf03 / drf版本认证权限

django查漏补缺