2009-10-30 57 views
0

一些背景开始:Asp.net MVC会员设计

我已经实现了自定义的MembershipProvider,从我所谓的“WebMemberShipProvider”

目前我已经叫服务“的服务层验证用户MembershipService“,该服务在服务层上实现接口IMembershipService。 这MemberShipService查询DAL和验证基于用户名/密码

用户我也创建了一个定制AuthorizeAttribute名为“AuthorizeOwnerAttribute”而这正是我在设计问题。

对于每个控制器,我都依赖于服务。例如。 UsersController在它的构造函数中接受一个I​​UserService。

如何在当前登录用户和正在编辑的用户具有相同“StudioId”的ActionResult上调用AuthorizeAttribute。注:我想用AuthorizeAttribute多个控制器,而不仅仅是“UserController的”

所以我的问题给你:

  1. 我应该怎么做来存储 当前认证用户的 “StudioId”,如这将在多个控制器上使用 。
  2. 我应该如何将认证传递给服务层,因为我想验证请求在服务和数据访问层中是有效的,而不仅仅是在客户端。 (如果这是可取的,我只是假设客户机上验证仅是不够的,如果我想在一个独立的应用程序以后再次使用BLL和DAL)使用

技术: - LINQ到通过 库模式 SQL - ASP.NET MVC预览2

任何建议或代码示例将非常欢迎。

+0

只是一些澄清...你是否实施System.Web.Security.MembershipProvider? – zowens 2009-10-30 16:55:08

+0

是的,System.Web.Security.MembershipProvider – 2009-10-30 18:24:53

回答

1

我基本上做了我的安全主要是在控制器级别这样的事情。我做出了一个决定,不把事情放在链条的下面,以便确定一个人是否可以访问它,或者如果我确实要确保IPrincipal.IsInRole()足以满足它。

现在我做了一些其他的感觉有点hackier。我需要确保那些已经注册并且分配给他们的人是唯一能够从本节访问它的人。

所以我创建了一个属性过滤器的工作原理大致是这样的:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var thingToView = filterContext.ActionParameters[_thingToView] as thingToView ; 
      var registration = filterContext.ActionParameters[_registration] as Registration; 


      if (!registration.CanSeeThing(thingToView)) 
      { 
       throw new RegistrationCannotViewThing(registration, thingToView); 
      } 

      base.OnActionExecuting(filterContext); 
     } 

现在,在这个实现觉得有点哈克的事情是,我这样做对我的控制器的方法:

[AuthFilter(ThingToView ="thingToView", Registration="registration") 
public ActionResult Method(Thing thingToView, Registration registration) 
{ 
.... 
} 

实际参数分配发生在模型联编程序中。安全性通过检查传递给方法的参数的过滤器发生。然后,我在很多地方重用了这个过滤器。

为了传递用户正在调用的方法,我在模拟活页夹上做了一件类似于Scott Hanselman的帖子:http://www.hanselman.com/blog/IPrincipalUserModelBinderInASPNETMVCForEasierTesting.aspx

我想你可以使用上面的示例博客帖子来获取你的用户对象到你的控制器方法,以便将它传递给你的服务层。

+0

必须有一个更清洁的SOC方式来做到这一点? 这对我来说是最后一招。感谢您的输入。 – 2009-10-30 19:09:05

+0

好吧,重读您的帖子后,您可以将工作室ID存储在自定义应用程序主体中。有很多教程可以找到,以便在asp.net应用程序中设置IPrincipal。 如果您想要传递验证,您可以手动将IPrincipal传递到服务层,或使用一些AOP技术。我确实试图坚持使用MVC中提供的内容。 AOP在.Net中没有广泛使用(或者至少我不这么认为)。 – Min 2009-10-30 19:54:50