• 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

    • 博客地址:http://www.cnblogs.com/wolf-sun/ 
      博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/Jeely/p/11062577.html
Copyright © 2020-2023  润新知