Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该对我的域服务进行授权吗?_C#_Authorization_Domain Driven Design - Fatal编程技术网

C# 我应该对我的域服务进行授权吗?

C# 我应该对我的域服务进行授权吗?,c#,authorization,domain-driven-design,C#,Authorization,Domain Driven Design,我拥有以下域服务: pulic void DeleteCustomer(int customerId, string userIdentity, string userPassword) { //1º Do login operation to verify if the credentials are valid. customerRepository.DeleteById(customerId); } 假设我正在使用具有登录窗口的ASP.NET MVC或Windows窗体

我拥有以下域服务:

pulic void DeleteCustomer(int customerId, string userIdentity, string userPassword)
{
    //1º Do login operation to verify if the credentials are valid.

    customerRepository.DeleteById(customerId);
}
假设我正在使用具有登录窗口的ASP.NET MVC或Windows窗体应用程序的代码

每次操作都会再次验证登录,浪费资源

假设我将其更改为:

pulic void DeleteCustomer (int customerId, int requestUserId)
{
    //1º Trust that requestUserId is valid.

    //Do something with the requestUserId (e.g Set the UserId that deleted the customer)

    customerRepository.DeleteById(customerId);
}

在这种情况下,ASP.NET MVC或Windows Forms应用程序只需进行一次登录操作,但任何调用方都可以传递任何requestUserId,从而留下一个可怕的安全漏洞。

在任何需要授权的方法中进行授权都是有意义的,否则会出现安全问题,尤其是当这些方法是后端逻辑中的入口点时。这意味着,如果您将这些域服务部署为可从外部访问的另一层,那么这些方法确实需要保护

从这个角度来看,每个方法都应该能够保护自己不受无效或虚假输入的影响,这在这种情况下也是适用的

从无状态的角度来看,每个请求都应该彼此隔离,这意味着每个请求都应该携带所有必要的信息,而不依赖以前的请求,甚至不应该有服务器状态。因此,所有请求都应得到独立授权


此外,授权是一个交叉问题,您应该考虑将您的授权代码写入属性。

< P>在任何需要授权的方法中进行授权是有意义的,否则会出现安全问题,尤其是当这些方法在后端逻辑中<>强>入口点< /强>时。这意味着,如果您将这些域服务部署为可从外部访问的另一层,那么这些方法确实需要保护

从这个角度来看,每个方法都应该能够保护自己不受无效或虚假输入的影响,这在这种情况下也是适用的

从无状态的角度来看,每个请求都应该彼此隔离,这意味着每个请求都应该携带所有必要的信息,而不依赖以前的请求,甚至不应该有服务器状态。因此,所有请求都应得到独立授权


此外,授权是一个交叉的问题,你应该考虑写你的授权代码作为一个属性。

虽然我完全同意@ KhanhTO的逻辑,但我将把它扩展为,因为这是你的服务层,而不是属性,我更愿意插入一个授权服务接口,该接口将与登录用户进行检查,例如,查看他是否具有与其凭证相关联的正确权限来执行给定命令。

虽然我完全同意@KhanhTO的逻辑,但我会扩展它,因为这是您的服务层,除了属性之外,我更愿意插入一个授权服务接口,该接口将与登录的用户进行检查,例如,查看他是否具有与凭证关联的正确权限,以执行给定的命令。

Hi Kayes,在我的真实代码中,我这样做。但是我对性能不满意。嗨,凯斯,在我的真实代码中,我就是这么做的。但我对性能不满意。@Vinicius Gonçalves:对于您指出的asp.net mvc,有关登录用户的信息应该包含在加密的票证中。当服务器从客户端收到此票证时,服务器可以解密以获取信息,而无需访问数据库。@Vinicius Gonçalves:在授权的情况下,我认为我们通常需要保护后端服务的
入口点。如果进入点是ASP.NET MVC动作方法,我们可能需要考虑这一点。但是,如果您将域服务部署为另一层,这些将成为入口点,需要保护。@Vinicius Gonçalves:调用方是否与域服务处于同一进程中?调用方是否受到保护(如果调用方是后端的入口点)?@ViniciusGonçalves:如果您正在考虑从MVC层调用您的服务,那么您应该使用
System.Web.Security
中的MVC内置身份验证/授权类,或者使用自己的抽象来请求身份验证。来自其他层的信息。@Vinicius Gonçalves:如果您的域服务隐藏在mvc操作(您的调用方)后面,并且它们处于相同的过程中。我认为您只需要对mvc操作(入口点)进行授权即可。@Vinicius Gonçalves:对于您指出的asp.net mvc,有关登录用户的信息应该包含在加密票据中。当服务器从客户端收到此票证时,服务器可以解密以获取信息,而无需访问数据库。@Vinicius Gonçalves:在授权的情况下,我认为我们通常需要保护后端服务的
入口点。如果进入点是ASP.NET MVC动作方法,我们可能需要考虑这一点。但是,如果您将域服务部署为另一层,这些将成为入口点,需要保护。@Vinicius Gonçalves:调用方是否与域服务处于同一进程中?调用方是否受到保护(如果调用方是后端的入口点)?@ViniciusGonçalves:如果您正在考虑从MVC层调用您的服务,那么您应该使用
System.Web.Security
中的MVC内置身份验证/授权类,或者使用自己的抽象来请求身份验证。来自其他层的信息。@Vinicius Gonçalves:如果您的域服务隐藏在mvc操作(您的调用方)后面,并且它们处于相同的过程中。我认为您只需要对mvc操作(入口点)进行授权。