Запрос оценки клиента в Entity Framework Identity - PullRequest
0 голосов
/ 03 мая 2020

В моем приложении Asp. Net Core 3.1 я использую EF Core Identity для обработки аутентификации пользователей. Как поставщик базы данных я использую CosmosDB с SQL API.

Создание пользователя с userManager.CreateAsync(...) проходит гладко. Я вижу новые данные пользователя в базе данных. Но когда я пытаюсь войти с этими учетными данными, используя signInManager.PasswordSignInAsync(...), я получаю исключение:

InvalidOperationException: The LINQ expression 'DbSet<IdentityUserRole<string>>
.Join(
outer: DbSet<IdentityRole>,
inner: i => i.RoleId,
outerKeySelector: i0 => i0.Id,
innerKeySelector: (i, i0) => new TransparentIdentifier<IdentityUserRole<string>, IdentityRole>(
Outer = i,
Inner = i0
))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

Связанный документ Microsoft говорит, что этот запрос должен быть оценен на клиенте. Итак, мой вопрос, как я могу изменить запрос для IdentityRole для достижения ie, что?

Я использую сущности Identity по умолчанию - IdentityUser и IdentityRole

Код регистрации:

    public class DashboardController : Controller
    {
        private readonly UserManager<IdentityUser> _userManager;
        private readonly SignInManager<IdentityUser> _signInManager;

        public DashboardController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
        {
            _userManager = userManager;
            _signInManager = signInManager;
        }

        [HttpPost]
        public async Task<IActionResult> Register(string username, string password)
        {
            var user = new IdentityUser
            {
                UserName = username,
                Id = username,
            };

            var result = await _userManager.CreateAsync(user, password);

            if (result.Succeeded)
            {
                //sign in
                var signInResult = await _signInManager.PasswordSignInAsync(user, password, false, false);
                // here I also tried to use method with different signature (username, password, ...)

                if (signInResult.Succeeded)
                {
                    return RedirectToAction("Index");
                }
            }

            return RedirectToAction("Index");
        }

        [HttpPost]
        public async Task<IActionResult> SignIn(string username, string password)
        {
            var user = await _userManager.FindByNameAsync(username);

            if (user != null)
            {
                var signInResult = await _signInManager.PasswordSignInAsync(user.UserName, password, false, false);

                if (signInResult.Succeeded)
                {
                    return RedirectToAction("Index");
                }
            }

            return RedirectToAction("SignIn");
        }
        .
        .
        .
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...