检索属于已认证用户的条目

时间:2019-04-09 14:14:51

标签: entity-framework asp.net-core-mvc asp.net-identity

我正在将ASP.NET Core与Identity和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进行比较的电子邮件地址?

还是我应该从IdentityUser获取一个UserManager对象,并对此采取措施?也许是Id属性?我是否应该有一个扩展了ApplicationUser的{​​{1}}对象?

1 个答案:

答案 0 :(得分:1)

  

我应该有一个扩展IdentityUser的ApplicationUser对象吗?

是的!您的ApplicationUserPet类应如下所示:

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();