核心3.0 ApplicationUser始终为空

时间:2020-01-12 20:11:12

标签: asp.net-core asp.net-core-identity

我已经扩展了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 个答案:

答案 0 :(得分:1)

是的,您不能只注入ApplicationUser。认证之后,您所拥有的只是一个ClaimsPrincipal实例,而不是一个ApplicationUser实例。如果您需要一个实际的ApplicationUser实例,则必须根据ClaimsPrincipalHttpContext.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 ;
    }
}

似乎有很多东西可以传递,但是可以完成工作。

顺便说一句,索赔内容来自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,效果很好。谢谢乔恩。