将内置用户身份验证与代码优先数据库集成

时间:2018-01-13 10:52:59

标签: c# authentication asp.net-core

我没有成功地阅读和解决如何正确构建简单的MVC Web应用程序的想法。有很多教程,但每个教程都很糟糕,我的意思是它们展示了如何将简单类型字段添加到ApplicationUser并在AccountViewModelManageViewModel中使用它们。我需要的是使用自定义对象,而不是简单的字段。

我做了一个简单的测试解决方案。我尝试实现一对一(UserProfile - Address)关系。

这是我的 ApplicationUser.cs 类:

namespace DBRelationsTesting.Models
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public virtual AddressViewModel Address { get; set; }
        public virtual ICollection<PhotoGalleryViewModel> PhotoGallery { get; set; }
    }
}

AddresViewModel 类:

namespace DBRelationsTesting.Models.AccountViewModels
{
    public class AddressViewModel
    {
        [Key]
        public int AddressId { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
    }
}

因此,我创建了数据库类AddressViewModel,更新了视图,添加了DbSets并修改了控制器。

我得到的只是数据库中充满了外键数据,但我无法在Views中显示外键字段。 从我读到的这是用户身份验证的一些安全限制。这是真的吗?

在一个单独的测试项目中,我尝试使用相同但不在用户身份验证类中,并且在Controller中使用Include()函数后它可以工作(在Details操作的示例中)。它填补了外国的领域。

// GET: UserProfiles/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var userProfile = await _context.UserProfile
        .Include(usrProfile => usrProfile.Address)
        .SingleOrDefaultAsync(m => m.UserProfileID == id);
    if (userProfile == null)
    {
        return NotFound();
    }

    return View(userProfile);
} 

为什么在ManageController(在使用身份验证的项目中)无法使用Include()

在这种情况下,如何将自定义类与用户身份验证系统相关联,以便登录用户不会看到其他用户数据? 我应该在我的自定义UserProfile类中添加内置的User对象,如下所示?它会起作用吗?

public virtual User User { get; set; }

0 个答案:

没有答案