在多层web应用程序的服务层中引用microsoft . asp.net . identity被认为是不好的做法吗?

本文关键字:认为是 identity asp 应用程序 web 服务 microsoft 引用 net | 更新日期: 2023-09-27 17:52:52

在我的MVC应用程序中,我目前正在设置线程。CurrentPrincipal = Application_PostAuthenticateRequest()方法中的HttpContext.Current.User,例如

    protected void Application_PostAuthenticateRequest()
    {
        Thread.CurrentPrincipal = HttpContext.Current.User;
    }

这允许我使用线程。其他程序集中的CurrentPrincipal,即服务层。例如:

using System.Security;
using System.Security.Permissions;
using System.Threading;
using Microsoft.AspNet.Identity;
namespace ServiceLayer
{
public class FinancialAccount
{
    public decimal Balance { get; set; }
    public string Owner { get; set; }
}
public class FinancialAccountRepository
{
    public FinancialAccount GetById(int id)
    {
        if (id == 1)
            return new FinancialAccount {Owner = "ac40fe16-1971-4b0d-b4d5-af850d0c2c05", Balance = 40324234};
        return new FinancialAccount {Owner = "3e2d1b43-1c63-4263-8c52-44d050279596", Balance = 100};
    }
}
public class FinancialService
{
    private readonly FinancialAccountRepository _financialAccountRepository;
    public FinancialService()
    {
        _financialAccountRepository = new FinancialAccountRepository();
    }
    [PrincipalPermission(SecurityAction.Demand, Role = Constants.RoleNames.AccountHolder)]
    [PrincipalPermission(SecurityAction.Demand, Role = Constants.RoleNames.BankManager)]
    public string GetFinancialAccountDetails(int accountId)
    {
        FinancialAccount financialAccount = _financialAccountRepository.GetById(accountId);
        ThrowExceptionIfUnauthorized(financialAccount);
        return "The account balance of account: " + accountId + " is " + financialAccount.Balance.ToString("C");
    }
    private void ThrowExceptionIfUnauthorized(FinancialAccount financialAccount)
    {
        if (financialAccount.Owner != Thread.CurrentPrincipal.Identity.GetUserId() && !Thread.CurrentPrincipal.IsInRole(Constants.RoleNames.BankManager))
            throw new SecurityException();
    }
}
}

这一切似乎工作完美,虽然我有两个问题:

  1. 是否可以设置线程。PostAuthenticationRequest方法中的CurrentPrincipal ?
  2. 在我的服务层引用使用microsoft . asp.net . identity是可以的吗?

我需要引用Microsoft.AspNet.IDentity的原因是因为IPrincipal不包含userId,它只包含用户名。

如果这些被认为是不好的做法,我该如何解决我当前的问题?

在多层web应用程序的服务层中引用microsoft . asp.net . identity被认为是不好的做法吗?

  1. 是否可以设置线程。PostAuthenticationRequest方法中的CurrentPrincipal ?

是可以将主对象(HttpContext.Current.User)分配给当前线程。

  • 在我的服务层引用使用microsoft . asp.net . identity是可以的吗?
  • 这不是一个好的做法,尽管您可以访问它。

    原因是-

    1. 服务层不应该与表示层紧密耦合。
    2. 很难对服务层进行单元测试。

    相反,如果你想在服务层传递UserId作为参数。

    在你的场景

    您希望返回FinancialAccount而不是字符串值,并让表示层使用string.Format()创建文本。

    原因是你想维护单一职责原则。换句话说,如果你想稍后更改文本,这经常发生,你需要再次触摸服务层。

    public FinancialAccount GetFinancialAccountDetails(int accountId)
    {
       return _financialAccountRepository.GetById(accountId);        
    }