Добавление пользовательской заявки не работает в основной идентификации asp.net - PullRequest
0 голосов
/ 05 февраля 2019

Я создал CustomClaimType для хранения user id:

public static class CustomClaimTypes
{
    public const string UserId = "UserId";
}

Когда пользователь входит в систему, я установил его:

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, doc_session.ufname + " " + doc_session.ulname));
claims.Add(new Claim(CustomClaimTypes.UserId, doc_session.isci_id.Value.ToString()));
ClaimsIdentity userIdentity = new ClaimsIdentity(claims,"Identity.Application");
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);

Я также создал собственное расширение идентификации:

public static class IdentityExtensions
{
    public static int GetUserId(this IIdentity identity)
    {
        ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
        Claim claim = claimsIdentity?.FindFirst(CustomClaimTypes.UserId);

        if (claim == null)
            return 0;

        return int.Parse(claim.Value);
    }

    public static string GetName(this IIdentity identity)
    {
        ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
        Claim claim = claimsIdentity?.FindFirst(ClaimTypes.Name);

        return claim?.Value ?? string.Empty;
    }
}

Но когда я звоню User.Identity.GetUserId();, в результате я получаю 0 (ноль).

1 Ответ

0 голосов
/ 05 февраля 2019

Для добавления дополнительных утверждений в Identity вы можете реализовать пользовательские CustomClaimsPrincipalFactory.

  1. CustomClaimsPrincipalFactory

    public class CustomClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser<int>>
    {
        public CustomClaimsPrincipalFactory(UserManager<IdentityUser<int>> userManager,
                                                IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
        {
        }
    
        public async override Task<ClaimsPrincipal> CreateAsync(IdentityUser<int> user)
        {
            var principal = await base.CreateAsync(user);
    
            // Add your claims here
            ((ClaimsIdentity)principal.Identity).AddClaims(
                new[] { new Claim(ClaimTypes.Name, user.UserName),
                new Claim(CustomClaimTypes.UserId, user.Id.ToString())
                });
    
            return principal;
        }
    }
    
  2. Зарегистрироваться CustomClaimsPrincipalFactory

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
    
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser<int>>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser<int>>, CustomClaimsPrincipalFactory>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }
    
  3. IdentityExtensions

    public static class IdentityExtensions
    {
        public static int GetUserId(this ClaimsPrincipal identity)
        {
            Claim claim = identity?.FindFirst(CustomClaimTypes.UserId);
    
            if (claim == null)
                return 0;
    
            return int.Parse(claim.Value);
        }
    
        public static string GetName(this ClaimsPrincipal identity)
        {
            Claim claim = identity?.FindFirst(ClaimTypes.Name);
    
            return claim?.Value ?? string.Empty;
        }
    }
    
  4. Использование

    public IActionResult About()
    {
        var claims = User.Claims;
        var userId = User.GetUserId();
        var userName = User.GetName();
        ViewData["Message"] = "Your application description page.";
    
        return View();
    }
    
...