ASP MVC5 - 身份。如何获取当前的ApplicationUser并使用此用户查询用户作为​​外键的表

时间:2016-03-10 01:40:13

标签: c# asp.net asp.net-mvc

我有一个ASP.NET MVC应用程序。我使用个人用户帐户和身份API,只有canEdit角色中的用户才能编辑数据(我的数据是产品)。 ASPNetUsers和Products实体具有1:N关系(这只是一个例子)。因此,用户拥有(拥有)产品列表。

当用户请求http://localhost:1111/Products时,该页面应显示先前已登录的该用户的产品列表。

我不确定如何获取当前的ApplicationUser以及如何查询products表以获取属于用户的产品列表。

这是我的ProductsController的代码:

public class ProductsController : Controller
{
    private ApplicationDbContext db = new ApplicationDbContext();


    // GET: Products
    [AllowAnonymous]
    public ActionResult Index()
    {
        string currentUserId = User.Identity.GetUserId();
        ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

        //How to modify these sentence to get the products of the current user??
        Product product = db.Products.Find();
        return View(db.Products.ToList());
    }
....

3 个答案:

答案 0 :(得分:1)

由于您使用的是个人身份验证,因此您应该能够使用用户ID直接从Application DB访问该用户:

UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));

这将使用数据库中的用户创建一个对象,然后您可以使用以下内容调用它:

CurrentUser = UserManager.FindById(User.Identity.GetUserId());

要获取当前登录的用户,应自动使用登录用户的详细信息填充User对象。

由于您拥有[AllowAnonymous]属性,您还必须确保用户实际使用Request.IsAuthenticated登录,否则User对象将为null。

将它们全部添加在一起将使您的代码看起来像:

[AllowAnonymous]
public ActionResult Index()
{
    if (Request.IsAuthenticated)
    {
        UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
        ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId());

        // assuming there is some kind of relationship between products and users
        List<Product> products = db.Products.Where(p => p.User.Equals(currentUser.UserID)).ToList(); // or .email or other field from your users table

        // OPTIONAL: Make sure they see something
        if(products.Count ==0) // They have no related products so just send all of them
            products = db.Products.ToList();

        // only send the products related to that user
        return View(products);
    }
    // User is not authenticated, send them all products
    return View(db.Products.ToList());
}

答案 1 :(得分:0)

首先,检查Products类中是否有UserId,如果是,则:

string currentUserId = User.Identity.GetUserId();

var userProducts=db.products.Where(p=>p.UserId==currentUserId).Tolist();

//you need to replace in my code the UserId with the name of the user id from your products table. 

等于return View(db.Products.ToList());您只需要编写return View(userProducts);

...和Jake说的一样:删除属性[AllowAnonymous]

答案 2 :(得分:0)

试试这个

 Product product = CurrentUser.Products;