Значение доступа и перенаправления ASP Identity - PullRequest
0 голосов
/ 06 марта 2019

Желаемый результат:

Я портирую наши старые веб-учетные записи в Identity по множеству причин, однако в приложении могут быть только новые пользователи, созданные уполномоченным персоналом. Достаточно просто, просто заблокируйте страницу регистрации с помощью [Authorize (Role = "Admin")]. Сотрудник создаст пользователя с любым паролем, неважно, что сработает ссылка подтверждения электронной почты для пользователя. Как только это письмо будет подтверждено, я хочу заставить пользователя сбросить свой пароль.

Выпуск:

Используя asp Identity в .Net Core 2.2, я пытаюсь проверить значение пользовательского свойства для пользователя (bool) и, если false, выполнить перенаправление в браузере. Кажется, я застреваю при доступе к свойствам пользователя в Http-конвейере. Нулевые объекты и т. Д.

Что я пробовал

До сих пор я пытался использовать фильтр ресурсов, так как он срабатывает после фильтра аутентификации, поэтому я должен иметь возможность доступа к свойствам пользователя через HttpContext, но без радости. Затем я попытался реализовать какое-то промежуточное программное обеспечение, чтобы сделать то же самое, но все равно не получилось. Я просто не могу понять, как получить значение этого свойства через HttpContext, если это вообще возможно?

Модель пользователя

public class ApplicationUser : IdentityUser
    {
        public int CustomerId { get; set; }

        //I want to get this property value
        public bool PasswordConfirmed { get; set; }
    }

Я знаю, что мог бы просто использовать Фильтр Действий, чтобы сделать это, но, кажется, немного поздно в конвейере.

1 Ответ

0 голосов
/ 06 марта 2019

Итак, я получил свой ответ, забавно, как отнимание времени у проблемы облегчает ее решение!

Мне просто нужно добавить следующее в свой класс промежуточного программного обеспечения:

        public async Task Invoke(HttpContext httpContext, UserManager<ApplicationUser> userManager)
        {
            if (httpContext.User.Identity.IsAuthenticated)
            {
                ApplicationUser user = userManager.Users.Where(x => x.Id == httpContext.User.FindFirstValue(ClaimTypes.NameIdentifier)).SingleOrDefault();
                bool a = user.PasswordConfirmed;
                string b = httpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
                Debug.WriteLine("*****" + a + "*****");
                Debug.WriteLine("*****" + b + "*****");
                var code = await GetApplicationUserCode(user, userManager);
                String path = httpContext.Request.Path;
                if (!a && !path.Contains("/Identity/Account/ResetPassword"))
                {
                    httpContext.Response.Redirect("/Identity/Account/ResetPassword?code=" + HttpUtility.UrlEncode(code)
                    , false);
                }
            }

            await _next(httpContext);
        }

        private async Task<String> GetApplicationUserCode(ApplicationUser user, UserManager<ApplicationUser> userManager)
        {
            return await userManager.GeneratePasswordResetTokenAsync(user);
        }

Итак, что здесь происходит, мы получаем пользователя из идентификатора пользователя в httpContext. Это тогда дает мне доступ к пользовательским свойствам. Оттуда это довольно просто, за исключением того, что вам нужно сгенерировать действительный код для сброса пароля, который требует правильной кодировки для пути запроса, в противном случае он будет жаловаться, что он недействителен.

Наконец, поскольку существует только асинхронный метод для генерации токена, мы должны изменить Invoke на асинхронный метод, чтобы мы могли ожидать генерации кода. Проверено и работает

...