我已经扩展了Identityuser
public class ApplicationUser : IdentityUser
{
[MaxLength(150)]
public string FirstName { get ; set ; }
[MaxLength(150)]
public string LastName { get ; set ; }
public int AlternateUserId { get ; set ; }
[MaxLength(150)]
public string CompanyName { get ; set ; }
[MaxLength(38)]
[Required]
public string ClientId { get ; set ; }
[Required]
public int ShortClient { set ; get ; }
public bool Locked { set ; get ; }
}
在Startup.cs
中,我有:
services.AddIdentity<ApplicationUser, IdentityRole>().AddDefaultUI().AddEntityFrameworkStores<ApplicationDbContext>();
services.AddSingleton<ApplicationUser>();
但是在
public static class IdentityExtentionMethods
{
public static string FirstName(this IIdentity identity)
{
var claim = ((ClaimsIdentity)identity).FindFirst(ClaimTypes.GivenName);
// Test for null to avoid issues during local testing
return (claim != null) ? claim.Value : string.Empty;
}
}
声明始终为空,并且在我尝试注入ApplicationUser
的任何位置,该变量可用,但未填充用户信息。
@inject ApplicationUser applicationUser
@inject SignInManager<ApplicationUser> signInManager;
相反,它在一些Guid
字段中有一些伪值,而其他大多数内容都为空。
答案 0 :(得分:1)
是的,您不能只注入ApplicationUser
。认证之后,您所拥有的只是一个ClaimsPrincipal
实例,而不是一个ApplicationUser
实例。如果您需要一个实际的ApplicationUser
实例,则必须根据ClaimsPrincipal
(HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier)
)中存在的用户ID在数据库中查询该实例。
答案 1 :(得分:0)
正如Chris Pratt指出的那样,您无法通过Core 3.x中的注入获得ApplicationUser,我不确定较早的版本。更糟糕的是,它不在我能看到的任何文档中。
但是你可以得到
[L, U, P, Q] = lu (S)
正如克里斯还指出的,您可以得到
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager
ApplicationDbContext _dbContext
和
ClaimsPrincipal
我有IPrincipal,如下面的代码所示,使用SignInManager和UserManager就是获取ApplicationUser的全部
IPrincipal
您可以通过_layout.cshtml
这样访问public static class IdentityExtentionMethods
{
public static bool IsSysAdmin(this IPrincipal _principal,
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager)
{
var x = isSysAdmin(_principal, _signInManager, _userManager);
if (x.Result == false)
return false;
else
return true;
}
public static async Task<bool> isSysAdmin(this IPrincipal _principal,
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager)
{
var ci = _principal.Identity as ClaimsIdentity;
var userName = ci != null ? ci.FindFirst(ClaimTypes.Name) : null;
string username = userName?.Value;
// get ApplicationUser
var appUser = await _userManager.FindByNameAsync( username);
var _userClaims = await
_signInManager.ClaimsFactory.CreateAsync(appUser);
if (_userClaims.UserHasThisPermission(Permissions.AccessAll))
return true;
else
return false;
}
public static bool HasRole( this IPrincipal _principal,
string roleName,
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager,
ApplicationDbContext _dbContext)
{
var x = hasrole ( _principal , roleName , _signInManager , _userManager , _dbContext ) ;
if (x.Result == false)
return false;
else
return true;
}
private static async Task<bool> hasrole ( this IPrincipal _principal,
string roleName,
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager,
ApplicationDbContext _dbContext)
{
if (roleName == null)
throw new ArgumentNullException(nameof(roleName));
var ci = _principal.Identity as ClaimsIdentity;
var userName = ci != null ? ci.FindFirst(ClaimTypes.Name) : null;
string username = userName?.Value;
var appUser = await _userManager.FindByNameAsync( username);
if (_dbContext.Find<UserToRole>(appUser.Id, roleName) != null)
{
return true ;
}
return false ;
}
}
似乎有很多东西可以传递,但是可以完成工作。
Jon Smith编写了一款出色的应用程序,该应用程序具有MIT开源许可证,并允许您使用Core 3.0 / 1中的角色和权限。这非常复杂,但是他提供了缩小版本https://github.com/JonPSmith/PermissionsOnlyApp,效果很好。谢谢乔恩。