我正在创建财务应用。我使用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);
}
答案 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编写扩展方法。