首先需要知道服务运行在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
如上图,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); }