C# 对某些用户限制服务的最佳方式是什么

C# 对某些用户限制服务的最佳方式是什么,c#,asp.net,asp.net-mvc-2,design-patterns,domainservices,C#,Asp.net,Asp.net Mvc 2,Design Patterns,Domainservices,编辑:重新编写并简化问题,以供考虑 在我的服务层中,我有 GetAllMessages(string userid); 我可以在我的系统上有各种类型的用户,如客户/供应商等 此服务仅适用于所有类型的用户,但实施仅适用于选定用户的服务的最佳方式是什么 DeleteAllMessages(string userid); //client only NewSupplierMessages(string userid); //supplier 通常,这些方法将在一个名为MessagesServic

编辑:重新编写并简化问题,以供考虑

在我的服务层中,我有

GetAllMessages(string userid); 
我可以在我的系统上有各种类型的用户,如客户/供应商等

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

DeleteAllMessages(string userid); //client only
NewSupplierMessages(string userid); //supplier
通常,这些方法将在一个名为MessagesService的类中

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

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

}
public类ClientService:iclientworkservice
{
非公开会议;
私人IGenericRepo=_repo;
公共客户端服务(IUserSession\u session,IGenericRepo\u repo)
{
此会话=\u会话;
这是.\u repo=\u repo;
}
public ClientDetails GetClientDetails()
{
var loggedonuser=_session.GetUser();
如果(!loggedonuser.isClient())
抛出新的NoAccessException()
返回_repo.Single(x=>x.ClientID==loggedonuser.ClientID);
}
}
请参见

授权决定 身份应该被授予访问 具体资源。在ASP.NET中,有 有两种方法可以授权访问 给定资源:

文件授权

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

URL授权

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


  • 请考虑以一种更有组织的方式重新措辞你的问题。描述你的问题,然后问你的问题。我了解身份验证-我将对我的控制器应用属性/过滤器,以防止某些用户访问我的控制器,我的问题更多的是如何为经过身份验证的控制器组织我的DomainService层user@Haroon,这就是授权的意义所在。您已经对用户进行了身份验证,现在需要检查用户是否有权执行特定操作。实现它的方法有很多种,但我认为如果您首先理解授权与身份验证分离的概念会更好。在调用控制器时使用ModelValueProvider实现身份验证之前,我对身份验证很冷静,但是我更改了我的用户表,使每个人都成为一个用户表的一部分,因此,我想知道我是否应该坚持我在上面的编辑中概述的内容…我不会使用这些签名,这会使代码有点太脆弱。我建议为每个用户定义角色,然后根据这些角色授权每个请求。对于具体的实现,您可能希望看到。