编辑:重新编写并简化问题以供考虑。。。
在我的服务层中,我有一些类似的东西
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);
}
}
请参阅MSDN:ASP.NET授权
授权决定应授予身份访问特定资源。在ASP.NET中有两种方法可以授权访问给定资源:
文件授权
文件授权由执行FileAuthorizationModule。它检查.aspx的访问控制列表(ACL)或.asmx处理程序文件来确定用户是否应该访问文件。ACL权限已验证用于用户的Windows标识(如果启用了Windows身份验证)或的Windows标识ASP.NET进程。关于更多信息,请参阅ASP.NET模拟。
URL授权
URL授权由执行UrlAuthorizationModule,它映射ASP.NET中URL的用户和角色应用程序。可以使用此模块选择性地允许或拒绝访问应用程序的任意部分(通常是目录)用户或角色。
- ASP.NET中的身份验证和授权选项概述
- 构建安全的ASP.NET应用程序:身份验证、授权和安全通信
- 基于角色的访问控制
- 自定义基于角色的Web服务访问