C# 在业务层中使用asp.net标识并添加属性

C# 在业务层中使用asp.net标识并添加属性,c#,asp.net,asp.net-mvc,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Identity,我正在创建财务应用程序。我正在使用asp.net标识。当用户登录时,他们只会看到公司的记录。我有GetRecords(intuserid),它返回用户公司的所有记录 public List<FinanceData> GetRecords(int userID){ int companyID = userService.GetCompanyID(userID); financeService.GetFinanceData(companyID); } 公共

我正在创建财务应用程序。我正在使用asp.net标识。当用户登录时,他们只会看到公司的记录。我有GetRecords(intuserid),它返回用户公司的所有记录

public List<FinanceData> GetRecords(int userID){
       int companyID = userService.GetCompanyID(userID);
       financeService.GetFinanceData(companyID);
 }
公共列表GetRecords(int userID){
int companyID=userService.GetCompanyID(userID);
financeService.GetFinanceData(公司ID);
}
我的问题是:

1-在asp.net mvc层中,我可以访问User.Identity.Name,但在业务层(类库)中,我无法访问此数据属性。如何达到这个目标

2-我可以添加像User.Identity.CompanyID这样的属性吗?当用户登录时,我如何填充它。因为我不想每次请求都去数据库

我想这样使用我的方法:

public List<FinanceData> GetRecords(){
         financeService.GetFinanceData(User.Identity.CompanyID);
     }
公共列表GetRecords(){
financeService.GetFinanceData(User.Identity.CompanyID);
}

Asp.net identity使用声明存储用户信息,此模型非常灵活,您可以完全向其中添加自定义声明,如CompanyId。您必须在
应用程序用户
中实现这一点,或者在创建索赔实体的任何地方实现这一点,并将自定义索赔添加到其中

(以下代码是从MVC模板复制的)

检查这是否为null,是否经过身份验证,然后就可以开始了


为了更加方便,您可以为
.CompanyId
的ClaimsPrincipal编写扩展方法。

声明可以用来存储额外的用户信息,但在实践中,我认为这不是一个好方法。由于实际的用户对象在标识上是可扩展的,因此最好只向其添加其他属性。我存储在用户声明中的唯一信息是暂时的,就像Facebook身份验证令牌一样——它不适用于每个用户,不需要公开以进行编辑(例如在用户配置文件视图中),并且可能具有确定的“生存期”或者陈旧性因素。您可以在声明中存储您不希望每次从数据库查询的所有内容。这样,您就可以使用当前经过身份验证的用户,而无需在应用程序的所有层中反复检索附加信息。例如,我们使用它来存储角色,这非常方便。当然你不应该把所有东西都放在那里。。。如果您使用cookie auth^^^^ Umm,那么所有这些数据可能最终都会出现在cookie中。。。不。不确定您认为索赔发生了什么,但每次您点击索赔时,都会从数据库中查询索赔。它们不是以某种方式存储在请求之间的。不,它们不是每次都从数据库中查询的,这就是声明的目的,对吗?应存储简单的用户信息以及安全的“会话”。因此,如果您使用cookie auth,那么只要cookie有效并且您网站中的每个请求都获得cookie,该cookie将成为用户数据的源,并且数据库将仅在检查验证令牌(例如)时被命中。您可以通过创建一个带有生成的登录名等的空MVC5页面来轻松测试这一点。。。然后在
GenerateUserIdentityAsync
中设置一个断点,看看那个家伙被调用的频率。要做到这一点,必须先访问数据库。身份验证只提取某些用户详细信息。每次都需要查询类似于
CompanyID
的内容。即使使用声明也需要再次查询数据库以获取声明。@ChrisPratt这不是真的抱歉,但确实如此。它们实际上存储在数据库中,实体框架有标识扩展从数据库中检索它们。当您使用声明时,可以使用类似于scape的方法来监视向数据库发出的查询。您将看到出现查询。
public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // **Add custom user claims here**
        return userIdentity;
    }
}
var principal = Thread.CurrentPrincipal as ClaimsPrincipal