Как я могу установить данные в ApplicationUser? - PullRequest
1 голос
/ 30 апреля 2020

My ApplicationUser расширен виртуальным классом UserData, таким как

public partial class ApplicationUser : IdentityUser
{
  [IgnoreDataMember, NotMapped]
  public IEnumerable<UserData> UserData { get; set; }
}

Как я могу установить UserData, когда пользователь входит в мое приложение?

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
     var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
     if (result.Succeeded)
     {
         var user = _context.Users.Where(x => x.Email == Input.Email).FirstOrDefault();
         using (myContext myContext = new myContext())
         {
               user.UserData = myContext.UserData.Where(x => x.UserId == user.Id);
         }
     }
}

Так что UserData будет уже доступен для внедрения зависимостей на моих контроллерах? (Я установил данные в пользовательской переменной выше для демонстрационных целей)

К сожалению, установка UserData через identity.AddClaim не является опцией, и установка таких значений в сеансе не рекомендуется

Ответы [ 3 ]

1 голос
/ 03 мая 2020

Вы можете попробовать что-то вроде этого:

public async Task<ActionResult> Login(string username, int id)
{
    // get by username
    ApplicationUser user = UserManager.FindByName(username);

    // get by user id
    ApplicationUser user = db.Users.Find(id);

    // get current user
    ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext()
        .GetUserManager<ApplicationUserManager>().FindById(Convert
        .ToInt32(System.Web.HttpContext.Current.User.Identity.GetUserId()));

    // and some other useful methods        
    if (user == null)
    {
        // creating user 
        user = new ApplicationUser();

        // fill in the user properties 
        user.UserName = "johnny";
        user.Name = "Johnny English";
        //...
        var result = UserManager.Create(user);

        // set default user group and roles
        var defaultGroup = "xxxx-yyyy-zzzz-tttt"; // Id of the ApplicationGroup
        groupManager.SetUserGroups(user.Id, new string[] { defaultGroup });
        groupManager.SetGroupRoles(newGroup.Id, new string[] { role.Name });
    }
}

Надеюсь, это поможет.

1 голос
/ 08 мая 2020

Вы можете создать интерфейс ICurrentUserData и получить пользовательские данные из своего контекста в реализации.

public interface ICurrentUserData
{
    public IEnumerable<UserData> UserData { get; }

}

public class CurrentUserData : ICurrentUserData
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly myContext _context;
    private readonly UserManager<IdentityUser> _userManager;

    public CurrentUserData(myContext context, UserManager<ApplicationUser> userManager, IHttpContextAccessor httpContextAccessor)
    {
        _context = context;
        _userManager = userManager;
        _httpContextAccessor = httpContextAccessor;
    }

    private List<UserData> _userData;

    public IEnumerable<UserData> UserData 
    {
        get
        {
            if (_userData == null)
            {
                using (myContext myContext = new myContext())
                {
                    _userData = myContext.UserData.Where(x => x.UserId == _userManager.GetUserId(_httpContextAccessor.HttpContext.User)).ToList();
                }

            }
            return _userData;
        }
    }
}

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

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<ICurrentUserData, CurrentUserData>();
        services.AddHttpContextAccessor();
    }
}
0 голосов
/ 02 мая 2020

Что мне нравится делать в моих проектах, так это иметь отдельный SessionService (вы можете называть его так, как вам нравится), который является областью обслуживания, где хранятся все пользовательские параметры и настраиваемая информация (например, его / ее уровень доступа, предпочитаемый язык, роль, культурные предпочтения, национальность, валюта и т. д. c.).

Для инициализации этой службы я использую фильтр действий, и это один из примеров этого. Чтобы узнать больше о фильтре в ASP. Net Core, вы можете обратиться к их документации .

    public class SessionFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            if (context?.HttpContext == null) return;

            var services = context.HttpContext.RequestServices;
            var sessionProvider = services?.GetService<ISessionProvider>();
            if (sessionProvider == null) return;

            // Read the user identifier.
            var userRepository = services.GetService<IUserRepository>();
            Guid userId = default;

            var claims = context.HttpContext.User?.Claims;
            var idClaim = claims?.FirstOrDefault(c => c.Type == RequestData.ID_CLAIM)?.Value;
            if (userRepository != null && Guid.TryParse(idClaim, out var id))
            {
                var getUserInfo = await userRepository.EnsureExistsAsync(id, context.HttpContext.RequestAborted).ConfigureAwait(false);

                if (getUserInfo.Data && getUserInfo.Success)
                    userId = id;
            }

            // Read the preferred language.
            var headers = context.HttpContext.Request?.Headers;
            var preferredLanguage = string.Empty;

            if (headers != null && headers.TryGetValue(RequestData.LANGUAGE_HEADER, out var preferredLanguageHeader))
                preferredLanguage = preferredLanguageHeader.FirstOrDefault();

            if (string.IsNullOrWhiteSpace(preferredLanguage)) preferredLanguage = UserConfigurationParameters.DEFAULT_LANGUAGE;

            // Configure the current session.
            sessionProvider.ConfigureSession(userId, preferredLanguage);

            await next();
        }
    }

И это фактический SessionService (здесь он называется ISessionProvider) .

    public class SessionProvider : ISessionProvider
    {
        public SessionProvider()
        {
            this.PreferredLanguage = string.Empty;
        }

        public bool AllowReconfiguration { get; private set; }
        public bool IsConfigured { get; private set; }
        public Guid UserId { get; private set; }
        public string PreferredLanguage { get; private set; }

        public void ConfigureSession(Guid userId, string preferredLanguage, bool allowReconfiguration = false)
        {
            if (this.AllowReconfiguration == false && this.IsConfigured) throw new InvalidOperationException(ErrorMessages.SessionCannotBeReconfigured);

            this.UserId = userId;
            this.PreferredLanguage = preferredLanguage;

            this.IsConfigured = true;
            this.AllowReconfiguration = allowReconfiguration;
        }
    }

Таким образом, вы можете передавать данные о пользователе на каждый слой в вашем приложении благодаря механизму внедрения зависимостей в ASP.

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