zoukankan      html  css  js  c++  java
  • WCF Data Service安全分析和说明

    首先需要知道服务运行在asp.net的承载环境中,具体参考:

    http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx

    关于安全有个详细的参考地址:

    http://blogs.msdn.com/b/astoriateam/archive/tags/authentication/

    讲述了涉及安全各个方面,是个很好的资料

    本文就从常见的涉及安全的几个方面进行分析和说明

    服务端安全

    由于服务承载在IIS中,因此可以使用Asp.net的安全模型,如一般的Forms验证

    对于服务一般的处理是,把服务放到一个独立目录下如Services,使用Services\web.config设置目录的安全性,如下授予admins角色和d用户以访问权限:

    <?xml version="1.0"?>
    <configuration>
           <system.web>
                  <authorization>
                        <allow roles="admins"/>
                        <allow users="d"/>
                        <deny users="*"/>
                  </authorization>
           </system.web>
    </configuration>

    以上设置后,匿名用户就不可以访问了

    服务对象的安全
    DataService<T>对象的设置,仅授予可以察看的数据对象以相应的权限,这样客户端就不会看到其他的对象,增删改仅在必须的时候开放,或者把增
    删改放到一个独立的不同权限的服务上
    下例是设置一些限制的情况,如果不想让客户端看到更多的信息,可以把”*”条件移除,这样就只能看到设置的对象了
                  public static void InitializeService(DataServiceConfiguration config)
                  {
                                             config.SetEntitySetAccessRule("Orders", EntitySetRights.AllRead);
                         config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead); 
         config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
                  } 
    默认查询的限制

    对于授予了权限的实体,也可以根据角色或用户限定不同的范围[如果不限制的话,如果不设置的话,默认可以访问到整个表内容

    下例设置后http://localhost:1287/Services/NorthWindService.svc/Orders 查询就会根据用户情况返回不同的值,这样可以减少了数据暴露的范围

           [QueryInterceptor("Orders")]
                  public Expression<Func<Order, bool>> OrderFilter()
                  {
                        if (Roles.IsUserInRole("admins"))
                               return (Order od) => true;
                        else
                               return (Order od) => od.ShipName.StartsWith("H");
                  }
    当然由于当前在WEB环境中,也可以直接使用HttpContext.Current.User或者HttpContext.Current其他对象完成用户的限制等安全处理
    自定义查询

    这个根据查询条件自然就限制住了,定义linq查询条件时一定要把数据范围限制作

    设置安全后客户端的访问

    Ø 网页形式:浏览器中访问网站时,会按照asp.net的安全模型进行处理,导航到登陆页面,输入用户名、密码,然后可以访问服务

    Ø 一般的应用程序:如Console程序、WinForm程序的处理方式有些差别,最简单的步骤如下:

    1、服务端开放Authentication_JSON_AppService.axd服务,只要web.config增加以下配置节后,客户端即可访问

           <system.web.extensions>
                  <scripting>
                        <webServices>
                               <authenticationService enabled="true" requireSSL="false"/>
                        </webServices>
                  </scripting>
           </system.web.extensions>

    2、客户端设置”Client Application Service”[客户端需要引用完整的.net框架,而不是Profile框架],再引用System.Web.dll

    clip_image002

    如上图,URL设置到服务的根地址

    具体的代码:

    验证用户

    System.Web.Security.Membership.ValidateUser("d", "demo1234!");

    对Data Service的客户端代理OnContextCreated方法增加处理,把登陆的信息设置上

    namespace TestDS.North
    {
    	public partial class NorthwindEntities
    	{
    		partial void OnContextCreated()
    		{
    			this.SendingRequest +=
    			   new EventHandler<SendingRequestEventArgs>(OnSendingRequest);
    		}
    		void OnSendingRequest(object sender, SendingRequestEventArgs e)
    		{
    			ClientFormsIdentity id = Thread.CurrentPrincipal.Identity as ClientFormsIdentity;
    			if(id!=null)
    			{
    				((HttpWebRequest)e.Request).CookieContainer = id.AuthenticationCookies;
    			}
    		}
    	}
    }
    
    以上验证后就可正常的访问服务了
    NorthwindEntities ctx = new NorthwindEntities(u);
    var ods = from c in ctx.Orders select c;
    foreach (var o in ods)
    {
     Console.WriteLine(o.ShipName);
    }
    
    
    
  • 相关阅读:
    wpf随笔
    XGrid绑定(转)
    SQL Server 批量插入数据的两种方法(转)
    UdpClient的Connect究竟做了什么(转)
    InvokeHelper,让跨线程访问/修改主界面控件不再麻烦(转)
    [C#] Control.Invoke方法和跨线程访问控件
    多线程访问winform控件出现异常的解决方法
    http://www.jdon.com/mda/oo_relation.html
    三范式浅析(转)
    SQL 表锁(转)
  • 原文地址:https://www.cnblogs.com/2018/p/1858070.html
Copyright © 2011-2022 走看看