在rc1.final中,User.Identity中不存在getUserId。

3
我正在使用asp.net 5和Entity Framework 7创建一个Web应用程序,但在使用User.Identity时遇到了一些问题。在文档中,它说它位于命名空间User.Identity.Core中。当我通过NuGet安装它时,它会找到该方法。然而,我与UserManager存在冲突,因为它说它同时存在于User.Identity.CoreUser.Identity.EntityFramework中。如果我卸载User.Identity.EntityFramework,我将无法从我的User-model继承IdentityUser。我需要GetUserId来获取当前登录的用户... 我也尝试过使用
System.Web.HttpContext.Current.User.Identity.GetUserId(); 

但是似乎有一个类似的问题,就是说在HttpContext中不存在Current

有人知道如何解决这个问题吗?

使用project.json更新:

{
  "userSecretsId": "aspnet5-FrkKantine-1a8100b9-6fce-44b4-ac9d-6038ecf705f6",
  "version": "1.0.0-*",
  "compilationOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.Core": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
    "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Razor": "4.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "ef": "EntityFramework.Commands"
  },

  "frameworks": {
    "dnx451": { },
    "dnx50": {}
  },

  "exclude": [
    "wwwroot",
    "node_modules"
  ],
  "publishExclude": [
    "**.user",
    "**.vspscc"
  ],
  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  }
}

你所提到的方法是关于.NET Framework 4.x和旧版Identity的。 System.Web.* 中的所有类型基本上都是指与IIS紧密耦合的旧版ASP.NET。例如,在.NET Core中,HttpContext抽象类位于Microsoft.AspNetCore.Http中。有关asp.net core的一些非常基本的官方文档可以在此处找到https://docs.asp.net/en/latest/。但这仅是一个良好的入门,**非常不完整**。 - Tseng
你能否发布你的project.json文件,至少包括依赖项和框架部分? - Tseng
ASP.NET Core 1.0 RTM/EntityFramework 1.0 Core的解决方案是什么? - Reza
3个回答

7
自从ASP.NET Core 1.0(前身为ASP.NET 5)仍在开发中,事情经常变化。
请查看GitHub的公告跟踪器以获取ASP.NET Core 1.0版本的API更改(但不要在那里发布问题,这纯粹是供ASP.NET Core团队发布公告的)。
其中这些公告之一是关于移动GetUsernameGetUserIdIsSignedIn扩展方法的。

The claims that these extension methods refer to are configurable via IdentityOptions which was not currently being respected by the extensions methods which always referred to the build in ClaimTypes.NameIdentifier/Name.

These methods have been moved to address this: Before => After

User.GetUserId => UserManager.GetUserId(User)
User.GetUserName => UserManager.GetUserName(User)
User.IsSignedIn => SignInManager.IsSignedIn(User)

编辑: 我刚刚注意到这是针对RC2的,所以除非您使用夜间构建源,否则可能还不适用于您。

您的问题可能来自选择错误的软件包名称,因为它们在过去已经被重命名了半打次。

EntityFramework.MicrosoftSqlServerMicrosoft.AspNet.Identity.EntityFramework应该是适合您的软件包。(随着RC2它们又被重命名为Microsoft.EntityFrameworkCore.*Microsoft.AspNetCore.*,并且所有版本都重置为1.0)


糟糕...你无法将UserManager注入到ApplicationDbContext中,因为这会创建循环依赖关系。GetUserId()对于审计目的比用户名更有用。 - Alex Dresko
@AlexDresko:DbContext 不应该知道 UserManager。无论你尝试了什么,这都是错误的,你应该重新考虑你的设计。 - Tseng
@Tseng,我明白你的意思,相信我。但是你还有其他方法吗?https://gist.github.com/alexdresko/d25e691708c8f919a524422f86be1466本质上,我正在覆盖SaveChanges,以便为所有实体自动设置CreatedBy和ModifiedBy值。看起来这是最简单的事情,在几个项目中一直运行得很好。在EF6中,我能够GetUserId,但是EF Core要求我仅存储用户名,这不一定是唯一的。 - Alex Dresko
@AlexDresko: ……这仍然感觉有点“不好”,因为在代码中调用IoC容器是一种不良的实践方式,使得难以进行单元测试。因此,更清洁的方法是将其提取到一个IUserManagerFactory接口和UserManagerFactory类中,在那里注入IHttpContextAccessor并拥有一个GetUserManager方法来返回UserManager服务。现在工厂执行相同的操作(询问容器以获取服务),但这没关系,因为它就是一个工厂。并且对于单元测试,您可以模拟您的工厂,并以此方式测试您的ModifyBaseEntity方法是否具有正确的行为。 - Tseng
@AlexDresko:但只有在构造函数中这样做才有效。上面的代码将UserManager的解析推迟到调用SaveChanges()时,此时ApplicationDbContext已经被创建,并且任何对.GetService<ApplicationDbContext>()的调用都会返回已初始化的版本。默认情况下,DbContext被注册为作用域(请求期间的单例)。如果您仍然收到错误,请发布一个帖子,其中包含代码、确切的错误消息以及您已尝试过的内容。 - Tseng
显示剩余7条评论

0

解决方案1:

尝试这个:

using Microsoft.AspNet.Identity;

然后:

string userId = User.Identity.GetUserId();

解决方案2:

通常情况下,您应该确保用户已通过身份验证,然后获取用户信息/ID:

if (model != null)
    {
        model.IsUserAuthenticated = HttpContext.User.Identity.IsAuthenticated;

        if (model.IsUserAuthenticated)
        {
            model.UserName = HttpContext.User.Identity.Name;
        }
    }

嗨,谢谢回复。正如我在问题中尝试解释的那样,如果我只是使用Microsoft.AspNet.Identity,它无法找到GetUserId方法。最新版本似乎有一些更改,GetUserId不再是AspNet.Identity的一部分,而是位于AspNet.Identity.Core中,这是一个不同的dll,如果我尝试安装它会导致冲突...你发布的其他代码适用于获取名称,但我需要获取ID以进行查询(因为名称可能不唯一) - Julie Røsok
1
在asp.net core RC2中,默认情况下没有GetUserId(),而且您是否可以只使用[Authorize]装饰操作或控制器,而不是检查用户是否已通过身份验证? - conterio

0

如果您正在使用 .Net Core <= RC1 Update 1,仍然可以使用 GetUserId() 扩展。

需要参考资料:

using Microsoft.AspNet.Identity;
using System.Security.Claims;

用法: var id = User.GetUserId(); (而不是 User.Identity.GetUserId()

你提到的另一件不同的事情是关于HttpContext.Current为空,我猜测您正在尝试从类库或MVC范围之外访问用户。

如果您需要从类库访问HttpContext,则不能像静态属性一样直接访问它。 必须将其注入该类中

只需执行以下操作:

private readonly IHttpContextAccessor _httpContextAccessor;

public MyRepository(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

然后你可以像这样通过类中的所有方法使用它:

_httpContextAccessor.HttpContext.User.GetUserId();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接