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);
}

posted @ 2010-10-22 10:35  2012  阅读(2282)  评论(2编辑  收藏  举报