Core 3.0 ApplicationUser 始终为空
Core 3.0 ApplicationUser is always empty
我延长了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
字段中有一些虚拟值,其他大部分都是空值。
是的,你不能只注入 ApplicationUser
。身份验证后,您所拥有的只是一个 ClaimsPrincipal
,而不是 ApplicationUser
实例。如果您需要一个实际的 ApplicationUser
实例,那么您必须根据 ClaimsPrincipal
(HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier)
).
中存在的用户 ID 从数据库中查询该实例
正如 Chris Pratt 指出的那样,您无法通过在核心中注入来获取 ApplicationUser 3.x 我不确定早期版本。糟糕的是,它不在我能看到的任何地方的文档中。
但是你可以获得
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager
ApplicationDbContext _dbContext
正如克里斯还指出的那样,您可以获得
ClaimsPrincipal
和
IPrincipal
我有 IPrincipal,如下面的代码所示,只需使用 SignInManager 和 UserManager 即可获得 ApplicationUser
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 ;
}
}
你这样访问来自_layout.cshtml
@using Microsoft.AspNetCore.Identity
@inject ApplicationDbContext dbcontext ;
@inject UserManager<ApplicationUser> userManager ;
@inject SignInManager<ApplicationUser> signInManager;
;;
;;
@if ( this.User.IsSysAdmin ( signInManager , userManager ) )
{
<!-- add menu stuff -->
}
@if ( this.User.HasRole ( signInManager , userManager,dbcontext ) )
{
<!-- add menu stuff -->
}
确实看起来有很多东西要传递,但它完成了工作。
顺便说一句,声明内容来自 https://www.thereformedprogrammer.net/part-7-adding-the-better-asp-net-core-authorization-code-into-your-app/
Jon Smith 编写了一个很棒的应用程序,它拥有 MIT 开源许可证并允许您在 Core 3.0/1 中使用角色和权限它非常复杂,但他提供了一个缩小版本 https://github.com/JonPSmith/PermissionsOnlyApp出色地。谢谢乔恩。
我延长了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
字段中有一些虚拟值,其他大部分都是空值。
是的,你不能只注入 ApplicationUser
。身份验证后,您所拥有的只是一个 ClaimsPrincipal
,而不是 ApplicationUser
实例。如果您需要一个实际的 ApplicationUser
实例,那么您必须根据 ClaimsPrincipal
(HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier)
).
正如 Chris Pratt 指出的那样,您无法通过在核心中注入来获取 ApplicationUser 3.x 我不确定早期版本。糟糕的是,它不在我能看到的任何地方的文档中。
但是你可以获得
SignInManager<ApplicationUser> _signInManager,
UserManager <ApplicationUser> _userManager
ApplicationDbContext _dbContext
正如克里斯还指出的那样,您可以获得
ClaimsPrincipal
和
IPrincipal
我有 IPrincipal,如下面的代码所示,只需使用 SignInManager 和 UserManager 即可获得 ApplicationUser
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 ;
}
}
你这样访问来自_layout.cshtml
@using Microsoft.AspNetCore.Identity
@inject ApplicationDbContext dbcontext ;
@inject UserManager<ApplicationUser> userManager ;
@inject SignInManager<ApplicationUser> signInManager;
;;
;;
@if ( this.User.IsSysAdmin ( signInManager , userManager ) )
{
<!-- add menu stuff -->
}
@if ( this.User.HasRole ( signInManager , userManager,dbcontext ) )
{
<!-- add menu stuff -->
}
确实看起来有很多东西要传递,但它完成了工作。
顺便说一句,声明内容来自 https://www.thereformedprogrammer.net/part-7-adding-the-better-asp-net-core-authorization-code-into-your-app/
Jon Smith 编写了一个很棒的应用程序,它拥有 MIT 开源许可证并允许您在 Core 3.0/1 中使用角色和权限它非常复杂,但他提供了一个缩小版本 https://github.com/JonPSmith/PermissionsOnlyApp出色地。谢谢乔恩。