Asp.Net Core Identity Получить Integer Идентификатор пользователя - PullRequest
1 голос
/ 27 июня 2019

У меня есть ASP.NET MVC Core n-уровневое приложение.Я изменил первичный ключ по умолчанию на целое число.Нет проблем.Но я пытаюсь GetUserId () метод по умолчанию UserManager возвращает строку.Я пишу свой собственный метод или я сделал что-то не так?

//In controller
public int GetLoggedUserId()
{
    //it's return still string and of course i can't compile my code 
    //problem is here
    return UserService.GetUserId(); 
}

public class ApplicationUser : IdentityUser<int>
{
    [MaxLength(255)]
    public string LogoPath { get; set; }
}

public partial class MyUserManager : UserManager<ApplicationUser>
{
    private readonly IUnitOfWork _unitOfWork;

    public MyUserManager(IUnitOfWork unitOfWork,
                            IUserStore<ApplicationUser> store,
                            IOptions<IdentityOptions> optionsAccessor,
                            IPasswordHasher<ApplicationUser> passwordHasher,
                            IEnumerable<IUserValidator<ApplicationUser>> userValidators,
                            IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators,
                            ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors,
                            IServiceProvider services,
                            ILogger<UserManager<ApplicationUser>> logger) :
        base(store, optionsAccessor, passwordHasher,
            userValidators,
            passwordValidators,
            keyNormalizer,
            errors,
            services,
            logger)
    {
        _unitOfWork = unitOfWork;
    }
}

services.AddDefaultIdentity<ApplicationUser>()
        .AddEntityFrameworkStores<MyDbContext>()
        .AddUserManager<MyUserManager>()
        .AddDefaultTokenProviders();

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Идентификатор пользователя сохраняется как заявка на пользователя.Вы можете получить к нему доступ через (в контроллере / странице / представлении):

string userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

Заявка хранится в виде строки, поэтому, если вам нужен int:

var userIdClaim = User.FindFirstValue(ClaimTypes.NameIdentifier);
var userId = int.TryParse(userIdClaim, out var id) ? id : 0;

Пользовательпринципал существует в HttpContext, поэтому вне мест, где существует удобное свойство User, вам нужно будет ввести IHttpContextAccessor, а затем:

var userIdClaim = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier);
0 голосов
/ 27 июня 2019

Метод по умолчанию .GetUserId() действительно возвращает строку. Эту проблему можно решить, написав собственный метод, который получает доступ к значению int из базы данных и возвращает его в ваш метод GetLoggedUserId().

...