我意识到这个问题对某些人来说可能看起来微不足道,但是这些类型的东西让我发现自己很多时候都在战斗,我只是想弄清楚这一切尽管在.net中看起来像是一场失败的战斗(无论如何对我来说) ).
所以,如果我做以下事情:
using System.Web;
...
ApplicationUser user = System.Web.HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)
这会产生标题中的错误和红色GetOwinContext()和错误无法解析符号'GetOwinContext()'
但是,如果我执行以下操作(System.Web从前面删除HttpContext),它按预期工作(或至少没有错误):
using System.Web;
...
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做(使用using System.Web注释掉的同一行):
//using System.Web;
...
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)
它产生相同的红色GetOwinContext()和错误无法解析符号'GetOwinContext()'
如果我谷歌HttpContext我只能发现它源于System.Web.
所以,问题是为什么我不能像上面第一个例子那样使用完整的语法?(在答案中也提到了最高票数:ASP.NET MVC 5 - Identity.如何获取当前的ApplicationUser)
更新(以解决重复的问题回复):虽然对该问题的答案可能得出相同的结论,但我真的不明白这是一个重复的问题.试着从新手的角度来思考它并解析所有的烟雾和镜子.Net.我从来没有尝试过像生活中那样令人费解的东西.有时你必须从许多不同的角度看问题.
我实际上看到了这个问题以及另一个关于使用的问题Current,但是没有让我感到震惊1)作为我正在寻找的答案(当时)2)更重要的是,为什么它表现得那样.Sam的答案很完美,虽然有点过头了.但是,至少现在,我可以去研究这一切意味着什么......
我正在尝试通过EF6/Package Manager中的迁移工具重命名我的Identity 2.0表.然而,它正在炸毁一部分.我只是在IdentityModels.cs中的"ApplicationDBContext Create"之后调用以下代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("Users");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
}
Run Code Online (Sandbox Code Playgroud)
然后它吹了这个错误:
PM> Update-Database -Verbose
Using StartUp project 'ProjectSender'.
Using NuGet project 'ProjectSender'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Projectsender' (DataSource: x.x.x.x, Provider: System.Data.SqlClient, Origin: Configuration).
Applying explicit migrations: [201505080059533_RenameTables].
Applying explicit migration: 201505080059533_RenameTables.
EXECUTE sp_rename @objname = N'dbo.AspNetRoles', @newname = N'Roles', @objtype = N'OBJECT'
IF object_id('[PK_dbo.AspNetRoles]') IS NOT NULL BEGIN
EXECUTE …Run Code Online (Sandbox Code Playgroud) 我正在使用MVC5和最新版本的Identity(2.1)我正在尝试为facebook access_token创建用户声明.我之前从未创建过声明,但据我所知,我的其他身份功能正常工作.
我的Startup.Auth.cs中有这行代码:
context.Identity.AddClaim(new Claim("urn:facebook:access_token",
context.AccessToken, xmlSchemaString, "Facebook"));
Run Code Online (Sandbox Code Playgroud)
如果您需要更多参考,那么完整的代码就在这里:将facebooksdk与Identity 2.0集成
如果我在该行后面的行中的代码中断,我可以看到所有内容都被正确检索,最重要的是content.AccessToken(这是一个巨大的字符串).但是,在完成成功登录后,它永远不会进入数据库.
作为测试,我尝试通过将行更改为此来简化它:
context.Identity.AddClaim(new System.Security.Claims.Claim(ClaimTypes.Email, "test@example.com"));
Run Code Online (Sandbox Code Playgroud)
结果相同,没有错误,但没有任何内容添加到数据库中.然后我尝试在IdentityModels.cs中添加这行代码,它告诉您放置自定义声明:
// Add custom user claims here
userIdentity.AddClaim(new Claim(ClaimTypes.DateOfBirth, "01/01/1972"));
Run Code Online (Sandbox Code Playgroud)
相同的结果......没有错误,永远不会进入数据库.任何人都可以想到我的问题可能是什么原因吗?
我的身份设置中唯一自定义的是我关于如何使用用户名而不是电子邮件(作为用户名)的文章.此外,我更改了块中的标识表名称(例如UserClaims),OnModelCreating这似乎是一个相当标准的过程.
我有一种感觉,这将是一些菜鸟的举动,但此刻,我很难过.任何帮助深表感谢.