• 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/ 
      博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
  • 相关阅读:
    java读取properties 属性文件
    oracle中插入一条数据,id自动增长,插入之后怎么得到这个id(sequence的使用)
    Android布局实现圆角边框
    TabHost中使用startActivityForResult无法接收返回值的解决方案[转]
    ORA00937: not a singlegroup group function
    MVC与WebForm最大的区别
    使用SQL Server存储ASP.NET Session变量
    JS中的event 对象详解
    一列多行值合并成一个值(MS SQL SERVER 2008)
    c#如何共享程序集
  • 原文地址:https://www.cnblogs.com/Jeely/p/11062577.html
Copyright © 2020-2023  润新知