我想编写一个
ClaimsPrincipal
扩展,返回与设置了 IsLimited
标志的用户关联的公司。
public static class ClaimsPrincipalExtensions
{
public static bool IsLimitedUser(this ClaimsPrincipal principal)
{
ArgumentNullException.ThrowIfNull(principal);
var claim = principal.FindFirst(ClaimTypes.NameIdentifier);
if (claim != null)
{
return dbContext.Users
.Where(u => u.Id == claim.Value)
.Select(u => u.Facility.Company.IsLimited)
.FirstOrDefault();
}
return false;
}
}
但是如何在上面的代码中初始化
dbContext
呢?
我正在考虑从我的 _Layout.cshtml 页面调用此方法,因此它将在每个页面请求上调用,因此我希望它尽可能优化。事实上,如果可能的话,我想用
ClaimsPrincipal
缓存该值。不管怎样,我第一次还是需要DbContext
。
如果要在静态类中使用dbcontext,则需要使用方法注入,您应该修改方法以添加新参数IServiceProvider,然后从布局页面传递它。
更多详情,可以参考以下代码:
public static class ClaimsPrincipalExtensions
{
public static bool IsLimitedUser(this ClaimsPrincipal principal, IServiceProvider serviceProvider)
{
ArgumentNullException.ThrowIfNull(principal);
// Resolve DbContext from the service provider
using (var scope = serviceProvider.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var claim = principal.FindFirst(ClaimTypes.NameIdentifier);
if (claim != null)
{
//// Query the database
//bool isLimited = dbContext.Users
// .Where(u => u.Id == claim.Value)
// .Select(u => u.Facility.Company.IsLimited)
// .FirstOrDefault();
var test = dbContext.Users.ToList();
bool isLimited = true;
return isLimited;
}
}
return false;
}
}
布局:
@using Microsoft.Extensions.DependencyInjection
@inject IServiceProvider ServiceProvider
...
@{
var isLimitedUser = User.IsLimitedUser(ServiceProvider);
}
@if (isLimitedUser)
{
<p>User has limited access.</p>
}
else
{
<p>User has full access.</p>
}
结果: