(使用VS2013 RTW,ASP.NET MVC5)
我看到了很多关于如何在使用ASP.NET身份验证时向ApplicationUser类(和表)添加属性的文档。但是我没有看到任何关于如何通过外键将内容映射到ApplicationUser表的单独表的文档。
我已成功派生了自己的Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext,现在我的自己的“UserPreferences”表与我的SQL Server数据库中的各种“AspNet *”表和谐共存。但是我不清楚获取当前用户ID的最佳方法,以便将新行写入“UserPreferences”表。请注意,该项目是ASP.NET MVC,但我已添加并正在Web API控制器内部工作。
我有一个可行的解决方案,即:
var uman = new Microsoft.AspNet.Identity.UserManager<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new Microsoft.AspNet.Identity.EntityFramework.UserStore<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new App1.Data.App1DbContext()));
var uident = User.Identity;
var userobject = uman.FindByNameAsync(uident.Name);
var userid = userobject.Result.Id;
// (Perform new row creation including the userid we just looked up
考虑到AspNetUsers表格(由Identity框架定义)包含以下字段:
-id (PK, nvarchar(128) - seems to contain a GUID, not sure why not an autoincrement integer, but I assume there are reasons for this)
-Username (nvarchar(max))
-PasswordHash (nvarchar(max))
-SecurityStamp (nvarchar(max))
我认为在这个表格中,参考id字段(而不是用户名)是正确的。 (我想到用户可能会更改他/她的用户名,并且其他人可能会假设另一个用户的用户名,这就是为什么两个字段都很重要。)因此,我需要获取当前用户的ID以存储在“UserPreferences”表中,这就是上面的代码所做的事情。但是这种查找似乎效率低下。
一个重要的点是,在System.Web.Mvc.Controller的上下文中,我可以执行以下操作:
User.Identity.GetUserId()
(Runtime type of User.Identity: System.Security.Principal.GenericIdentity)
但在 System.Web.Http.ApiController(Web API)的上下文中,我无法这样做,因为该方法不存在(User.Identity 的运行时类型为 System.Security.Claims.ClaimsIdentity),所以我必须依赖于以下方法:
User.Identity.Name
并进行额外的查找以将名称转换为ID。是否有任何建议可以改进这种情况?我是否以正确的方式处理将用户数据写入单独的表的任务?