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

时间:2015-03-25 15:02:44

标签: c# asp.net asp.net-mvc asp.net-identity

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

public List<FinanceData> GetRecords(int userID){
       int companyID = userService.GetCompanyID(userID);
       financeService.GetFinanceData(companyID);
 }

我的问题是:

1-在asp.net mvc层,我可以访问User.Identity.Name但是业务层(类lib。)我无法访问此数据属性。怎么能达到这个目标?

2-我可以添加User.Identity.CompanyID等属性吗?如何在用户登录时填写它。因为我不想为每个请求转到数据库。

我想使用我的方法:

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

1 个答案:

答案 0 :(得分:4)

Asp.net身份使用声明存储用户信息,此模型非常灵活,您可以完全添加自定义声明,如CompanyId。您必须在ApplicationUser或创建ClaimsIdentity的位置实现该功能,并将自定义声明添加到其中。

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

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

然后,您可以通过Thread.CurrentPrinciapl在您的应用中的任何位置使用ClaimsPrincipal,该应用在同一AppDomain中运行。因此,如果您的其他图层未在其他位置作为服务运行,则可以完全使用

var principal = Thread.CurrentPrincipal as ClaimsPrincipal

检查这是否为空并且是否经过身份验证,您应该好好去。

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