Core 3.0 ApplicationUser всегда пуст - PullRequest
0 голосов
/ 12 января 2020

Я расширил 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, и большинство всего остального равно нулю.

Ответы [ 2 ]

1 голос
/ 13 января 2020

Да, вы не можете просто ввести ApplicationUser. После аутентификации у вас есть только ClaimsPrincipal, а не ApplicationUser экземпляр. Если вам нужен фактический ApplicationUser экземпляр, то вы должны запросить его из базы данных на основе идентификатора пользователя, присутствующего в ClaimsPrincipal (HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier)).

0 голосов
/ 14 января 2020

Как отмечает Крис Пратт, вы не можете получить 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, которая хорошо работает. Спасибо Джон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...