Как отмечает Крис Пратт, вы не можете получить ApplicationUser через внедрение в Core 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.cs html
@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/
Джон Смит написал замечательное приложение, которое имеет лицензию MIT с открытым исходным кодом и позволяет вам использовать роли и разрешения в Core 3.0 / 1 это очень сложно, но он предоставил уменьшенную версию https://github.com/JonPSmith/PermissionsOnlyApp, которая хорошо работает. Спасибо Джон.