【问题标题】:what is the best way to restrict services for certain users限制某些用户的服务的最佳方法是什么
【发布时间】:2011-09-14 19:23:53
【问题描述】:

编辑:改写并简化问题以保持简洁......

在我的服务层我有类似的东西

GetAllMessages(string userid); 

我的系统上可以有各种类型的用户,例如客户/供应商等...

此服务仅适用于所有类型的用户,但是实施仅对选定用户可用的服务的最佳方式是什么,例如

DeleteAllMessages(string userid); //client only
NewSupplierMessages(string userid); //supplier

通常,这些方法将在一个名为 MessagesService

的类中

注意:为了澄清,用户已登录并通过身份验证,但是我想知道我是否应该这样编写方法:

DeleteAllMessages(ClientUser user); //client only
NewSupplierMessages(SupplierUser userid); //supplier

基本上获取用户每一个动作的详细信息,并以更强类型的方式调用方法...

编辑 2:

请注意,我的域层与我的 Web 应用程序位于单独的类库中,“客户端用户”将成为“客户端”的一部分,同样,“供应商用户”将成为“供应商”的一部分 - 所以如果我想要查询我的服务层并调用正确的代码(即检索正确的详细信息) - 我必须传入用户 id 或用户的强类型类,我看不出如何对代表谁可以访问的 DTO 对象进行约束服务不正确/脆弱?

否则我会有这样的东西:

GetClientDetails();

用户由 asp.net 处理,因此我们知道用户可以访问此操作,但是如果有多个客户端怎么办?当然,我们必须传入一些客户端 ID/如果我要传入用户 ID,我可以从中获取客户端 ID...

我会说我的域层不正确,看到类似上面的签名......

编辑 3: 我能想到的唯一另一种选择是,当用户进行身份验证时,将使用存储在 asp.net mvc 应用程序内名为 UserSession 的类中作为全局状态,然后使用 DI(ninject)将其注入我的域服务层,因此当我的签名可以是

GetClientDetails();

实现这个接口的领域服务类可以是:

public class ClientService : IClientWorkerService
{

    private ISession _session;
    private IGenericRepo = _repo;
    public ClientService(IUserSession _session, IGenericRepo _repo)
    {
      this._session = _session;
      this._repo = _repo;
    }

    public ClientDetails GetClientDetails()
    {
      var loggedonuser = _session.GetUser();

      if(!loggedonuser.isClient())
        throw new NoAccessException()

      return _repo.Single<Client>(x=> x.ClientID == loggedonuser.ClientID);
    }

}

【问题讨论】:

  • 请考虑以更有条理的方式重新表述您的问题。描述您的问题,然后提出您的问题。

标签: c# asp.net asp.net-mvc-2 design-patterns domainservices


【解决方案1】:

MSDN: ASP.NET Authorization

授权决定是否 身份应被授予访问 具体资源。在 ASP.NET 中,有 有两种方式来授权访问 给定资源:

文件授权

文件 授权由 文件授权模块。它检查 .aspx 的访问控制列表 (ACL) 或 .asmx 处理程序文件来确定 用户是否应该有权访问 文件。 ACL 权限已验证 对于用户的 Windows 身份(如果 Windows 身份验证已启用)或 对于 Windows 标识 ASP.NET 进程。了解更多信息, 请参阅 ASP.NET 模拟。

网址授权

网址授权 由执行 UrlAuthorizationModule,映射 用户和角色到 ASP.NET 中的 URL 应用程序。这个模块可以用 选择性地允许或拒绝访问 应用程序的任意部分 (通常是目录)用于特定的 用户或角色。

【讨论】:

  • 我了解身份验证-我会将属性/过滤器应用于我的控制器以防止某些用户访问我的控制器,我的问题更多是如何为经过身份验证的用户组织我的 DomainService 层
  • @Haroon,这就是授权出现的地方。您已经对用户进行了身份验证,现在您需要检查用户是否有权执行特定操作。实现它的方法有很多,但我认为如果您首先掌握授权与身份验证分开的概念会更好。
  • 我很喜欢身份验证,在调用控制器时使用 ModelValueProvider 实现它之前,但是我已经更改了我的用户表以使每个人都成为一个用户表的一部分,因此我想知道我是否应该坚持根据我在上面的编辑中概述的内容......
  • 我不会使用这些签名,它会使代码有点太脆弱。我建议为每个用户定义角色,然后根据这些角色授权每个请求。具体实现可以看this
猜你喜欢
  • 2012-07-26
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2010-10-11
  • 2011-01-17
  • 2011-04-27
相关资源
最近更新 更多