我正在使用 ASP.NET Core与Identity and Entity Framework Core一起使用。如何检索属于经过身份验证的用户的宠物?
[Authorize]
public class HomeController : Controller
{
private readonly PetContext _context;
public HomeController(PetContext context)
{
_context = context;
}
public IActionResult Index()
{
// User.Identity.IsAuthenticated -> true
// User.Identity.Name --> bob@example.com
ViewData.Model = _context.Pets.Where(pet => /* ...? */);
return View();
}
}
Pets
对象是否应包含类型 string
的"PetOwner"属性,该属性包含与User.Identity.Name
进行比较的电子邮件地址?
还是我应该从UserManager
那里得到一个IdentityUser
对象并用它做点什么?也许是Id
属性?我应该有一个扩展IdentityUser
的ApplicationUser
对象吗?
我应该有一个扩展 IdentityUser 的 ApplicationUser 对象吗?
是的!您的ApplicationUser
类和Pet
类应如下所示:
public class ApplicationUser : IdentityUser
{
public List<Pet> Pets {get; set;}
}
public class Pet
{
public int PetId {get; set;}
........
public string UserId {get; set;}
public ApplicationUser User {get; set;}
}
然后在Startup.ConfigureServices
中更新您的身份注册,如下所示:
services.AddDefaultIdentity<ApplicationUser>() //<-- Replace `IdentityUser` with `ApplicationUser`
.AddEntityFrameworkStores<AppliclationDbContext>()
.AddDefaultTokenProviders();
然后,您的查询应如下所示:
var loggedInUserId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
List<Pet> userPets = _context.Pets.Where(pet => pet.UserId == loggedInUserId).ToList();