В моем приложении 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");
}
.
.
.
}