asp.net-core-identity 相关问题

使用ASP.NET Core Identity将登录功能添加到ASP.NET Core应用程序。

在 ASP.NET Core MVC 中使用控制器中的视图模型显示多对多表数据

我想在控制器中使用视图模型显示多对多表数据,但出现此错误: CS0029:无法将类型“Website.Model.PostModel”隐式转换为“System.Collections.GenericList...

回答 1 投票 0

创建迁移和更新数据库时出错

为了自定义身份,我需要将上下文继承从 DbContext 更改为 IdentityDbContext,并向 IdentityUser 添加一些属性,我创建了两个类 ApplicationUser : IdentityUser 和

回答 1 投票 0

ASP.NET Core 8 基于默认身份令牌的身份验证不起作用 - 404 未找到错误

我正在尝试探索 .NET core 8 Web API 应用程序中基于身份令牌的身份验证。我能够注册用户、生成和存储令牌。然而,当我尝试访问授权的 api 时...

回答 1 投票 0

UserManager<User>在数据库asp.net core Identity中找不到现有用户

我有 ASP.NET Core 2.1 MVC 应用程序。另外,在数据库中,我有 1 个用户担任“管理员”角色,但是当我尝试获取数据库中的用户列表时,它返回一个空列表。它通常返回数据…

回答 3 投票 0

ASP.NET Core 8 身份授权-使用角色策略进行身份验证

在 ASP.NET Core 8 Web API 中,我有与授权和身份验证相关的配置: builder.Services.AddAuthentication("Bearer").AddJwtBearer(); 建设者.服务.

回答 1 投票 0

如何在.Net Core 2.0中检索声明值

正如标题中所述,我已经将声明分配给注册用户,现在我尝试在用户登录到 sql 中的 UserClaims 表中的应用程序时检索声明值

回答 2 投票 0

指定正确的上下文以将身份添加到现有数据库中

之前也发过类似的问题(1,2,3),但情况不同。 我有一个使用 EFCore 和一些现有实体的 .Net Core 7 应用程序。现在里面的所有东西都经过测试了

回答 2 投票 0

无法在 Blazor 应用程序中使用“dotnet ef 数据库更新”

我添加了一个授权的.NET Core Blazor项目。该项目添加了用于迁移、注册和登录组件等的脚手架文件... 我尝试通过

回答 1 投票 0

LINQ 查找没有给定角色的用户

有一个审计表供用户与系统交互,我需要构建一个执行以下 SQL 的 LINQ 查询。这样做的目标是撤回除用户创建的行之外的所有行

回答 1 投票 0

ASP.NET Core 5 Identity 中重置密码电子邮件出现无效令牌错误

当我尝试通过电子邮件单击重置密码链接来重置密码时,出现无效令牌错误。 我一直在寻找问题所在,并看到了很多解决方案,例如编码......

回答 1 投票 0

ASP.NET Core Identity,创建登录、注册操作。 AuthController

公共类AuthController:控制器 { SignInManager _signInManager { 获取; } UserManager _userManager { 获取; } RoleManager _roleMan...

回答 1 投票 0

ASP.NET Core Identity - 帐户控制器和文件夹在哪里

我是 .NET Core 的新手,想询问有关身份的问题。 我买了一本书并遵循了所有说明。按照书中描述的方式设置 Identity 非常简单。 创建一个帐户控制器,

回答 2 投票 0

.NET Core 5 Razor Pages Cookie 身份验证登录成功后重定向到登录页面

我使用“个人身份验证”创建了一个 ASP.NET Core Razor Pages Web 应用程序。然后我添加了身份脚手架并运行应用程序,它要求“应用迁移”我...

回答 1 投票 0

如何在设计时将接口注入到 DbContext 的构造函数中 ASP.NET Core Identity

我需要在设计时将 ICurrentTenantRepository 接口的实例传递到我的 AppDbContext 类的构造函数中,但我不知道该怎么做。我对

回答 1 投票 0

ASP.NET Core 身份和 Cookies

我有一个 ASP.NET Core 站点,使用 AspNetCore.Identity.EntityFrameworkCore 1.1.1 和 cookie 来授权/验证我的用户。无论我在下面的代码中选择什么设置,cookie

回答 3 投票 0

如何让 ASP.NET Core 身份电话号码显示在个人资料页面上?

我将 ASP.NET Core 身份实现到应用程序中,并实现了角色,一切都运行良好。我将电话号码添加为用户注册时的必填字段,它正在写入 SQL 数据...

回答 1 投票 0

将 .NET Core Identity 与 API 结合使用

我创建了一个 API 并从同一 API 设置了 JWT 身份验证(我选择不使用 IdentityServer4)。 我通过 services.AddAuthentication 做到了这一点 然后我在控制器中创建了令牌并且它起作用了。

回答 3 投票 0

如何在.Net Core测试中模拟UserManager?

我有以下代码。我正在尝试运行创建用户的测试用例。以下是我到目前为止所尝试的。 公共类 CreateUserCommandHandlerTest { 私人模拟 我有以下代码。我正在尝试运行创建用户的测试用例。以下是我到目前为止所尝试的。 public class CreateUserCommandHandlerTest { private Mock<UserManager<ApplicationUser>> _userManager; private CreateUserCommandHandler _systemUnderTest; public CreateUserCommandHandlerTest() { _userManager = MockUserManager.GetUserManager<ApplicationUser>(); var user = new ApplicationUser() { UserName = "ancon1", Email = "[email protected]", RoleType = RoleTypes.Anonymous }; _userManager .Setup(u => u.CreateAsync(user, "ancon2")).ReturnsAsync(IdentityResult.Success); _systemUnderTest = new CreateUserCommandHandler(_userManager.Object); } [Fact] public async void Handle_GivenValidInput_ReturnsCreatedResponse() { var command = new CreateUserCommand { Username = "ancon1", Email = "[email protected]", Password = "ancon2", RoleType = RoleTypes.Anonymous }; var result = await _systemUnderTest.Handle(command, default(CancellationToken)); Assert.NotNull(result); Assert.IsType<Application.Commands.CreatedResponse>(result); } } 我的用户经理在这里: public static class MockUserManager { public static Mock<UserManager<TUser>> GetUserManager<TUser>() where TUser : class { var store = new Mock<IUserStore<TUser>>(); var passwordHasher = new Mock<IPasswordHasher<TUser>>(); IList<IUserValidator<TUser>> userValidators = new List<IUserValidator<TUser>> { new UserValidator<TUser>() }; IList<IPasswordValidator<TUser>> passwordValidators = new List<IPasswordValidator<TUser>> { new PasswordValidator<TUser>() }; userValidators.Add(new UserValidator<TUser>()); passwordValidators.Add(new PasswordValidator<TUser>()); var userManager = new Mock<UserManager<TUser>>(store.Object, null, passwordHasher.Object, userValidators, passwordValidators, null, null, null, null); return userManager; } } 我的命令处理程序是这样的: public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, BaseCommandResponse> { private readonly UserManager<ApplicationUser> _userManager; public CreateUserCommandHandler(UserManager<ApplicationUser> userManager) { _userManager = userManager; } public async Task<BaseCommandResponse> Handle(CreateUserCommand createUserCommand, CancellationToken cancellationToken) { var user = new ApplicationUser { UserName = createUserCommand.Username, Email = createUserCommand.Email, RoleType = createUserCommand.RoleType }; var result = await _userManager.CreateAsync(user, createUserCommand.Password); if (result.Succeeded) { return new CreatedResponse(); } ErrorResponse errorResponse = new ErrorResponse(result.Errors.Select(e => e.Description).First()); return errorResponse; } } 当我运行测试时,它失败并显示对象引用未设置为对象的瞬间。 我在这里做错了什么?? 我知道这已经有几个月了,但我一直回到这个话题。我将扩展我自己关于这个主题的答案,因为仅仅指向 Haok 的 GitHub 示例就像在说:“读一本书”,因为它很大。它没有指出问题以及您需要做什么。您需要隔离一个 Mock 对象,但不仅如此,您还需要“设置”“CreateAsync”方法。所以让我们把它分成三个部分: 如果您使用 MOQ 或类似的框架来模拟创建 UserManager,则需要 MOCK。 您需要设置您希望从中获取结果的 UserManager 方法。 您可能希望从模拟的 Entity Framework Core 2.1 或类似版本中注入一些通用列表,以便您可以实际看到 IDentity 用户列表实际增加或减少。不仅仅是 UserManager 成功了,其他什么都没有 所以说我有一个返回模拟 UserManager 的辅助方法。与 Haok 代码略有不同: public static Mock<UserManager<TUser>> MockUserManager<TUser>(List<TUser> ls) where TUser : class { var store = new Mock<IUserStore<TUser>>(); var mgr = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null); mgr.Object.UserValidators.Add(new UserValidator<TUser>()); mgr.Object.PasswordValidators.Add(new PasswordValidator<TUser>()); mgr.Setup(x => x.DeleteAsync(It.IsAny<TUser>())).ReturnsAsync(IdentityResult.Success); mgr.Setup(x => x.CreateAsync(It.IsAny<TUser>(), It.IsAny<string>())).ReturnsAsync(IdentityResult.Success).Callback<TUser, string>((x, y) => ls.Add(x)); mgr.Setup(x => x.UpdateAsync(It.IsAny<TUser>())).ReturnsAsync(IdentityResult.Success); return mgr; } 关键是我正在注入一个通用的“TUser”,这也是我将要测试的内容,并注入一个列表。类似于我的例子: private List<ApplicationUser> _users = new List<ApplicationUser> { new ApplicationUser("User1", "[email protected]") { Id = 1 }, new ApplicationUser("User2", "[email protected]") { Id = 2 } }; ... private _userManager = MockUserManager<ApplicationUser>(_users).Object; 最后我正在使用类似于我要测试的实现的存储库来测试模式: public async Task<int> CreateUser(ApplicationUser user, string password) => (await _userManager.CreateAsync(user, password)).Succeeded ? user.Id : -1; 我这样测试: [Fact] public async Task CreateAUser() { var newUser = new ApplicationUser("NewUser", "[email protected]"); var password = "P@ssw0rd!"; var result = await CreateUser(newUser, password); Assert.Equal(3, _users.Count); } 我所做的关键是,我不仅“设置”了 CreateAsync,而且提供了一个回调,这样我实际上可以看到我注入的列表增加了。希望这对某人有帮助。 aspnet/Identity 是开源的,所以你能做的就是看看他们自己如何模拟它。 他们是这样做的:MockHelpers.cs 测试用户管理器 public static UserManager<TUser> TestUserManager<TUser>(IUserStore<TUser> store = null) where TUser : class { store = store ?? new Mock<IUserStore<TUser>>().Object; var options = new Mock<IOptions<IdentityOptions>>(); var idOptions = new IdentityOptions(); idOptions.Lockout.AllowedForNewUsers = false; options.Setup(o => o.Value).Returns(idOptions); var userValidators = new List<IUserValidator<TUser>>(); var validator = new Mock<IUserValidator<TUser>>(); userValidators.Add(validator.Object); var pwdValidators = new List<PasswordValidator<TUser>>(); pwdValidators.Add(new PasswordValidator<TUser>()); var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(), userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), new IdentityErrorDescriber(), null, new Mock<ILogger<UserManager<TUser>>>().Object); validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>())) .Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); return userManager; } 在 .NetCore 2.2 中,您必须做一些稍微不同的事情。将其视为@Nick Chapsas 答案的更新。 首先,你必须使用IUserPasswordStore而不是IUserStore。 IUserPasswordStore继承了IUserStore,但是UserManager想要获取IUserPasswordStore。换句话说,有些事情就行不通了。 如果您想测试 UserManager 的真实行为(例如 CreateUserAsync),您可以使用 UserValidator 和 PasswordValidator 的真实实现。您可能只是想确保您的方法对 CreateUser 错误做出应有的反应。 这是我更新的示例: UserManager<TUser> CreateUserManager() where TUser : class { Mock<IUserPasswordStore<TUser>> userPasswordStore = new Mock<IUserPasswordStore<TUser>>(); userPasswordStore.Setup(s => s.CreateAsync(It.IsAny<TUser>(), It.IsAny<CancellationToken>())) .Returns(Task.FromResult(IdentityResult.Success)); var options = new Mock<IOptions<IdentityOptions>>(); var idOptions = new IdentityOptions(); //this should be keep in sync with settings in ConfigureIdentity in WebApi -> Startup.cs idOptions.Lockout.AllowedForNewUsers = false; idOptions.Password.RequireDigit = true; idOptions.Password.RequireLowercase = true; idOptions.Password.RequireNonAlphanumeric = true; idOptions.Password.RequireUppercase = true; idOptions.Password.RequiredLength = 8; idOptions.Password.RequiredUniqueChars = 1; idOptions.SignIn.RequireConfirmedEmail = false; // Lockout settings. idOptions.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); idOptions.Lockout.MaxFailedAccessAttempts = 5; idOptions.Lockout.AllowedForNewUsers = true; options.Setup(o => o.Value).Returns(idOptions); var userValidators = new List<IUserValidator<TUser>>(); UserValidator<TUser> validator = new UserValidator<TUser>(); userValidators.Add(validator); var passValidator = new PasswordValidator<TUser>(); var pwdValidators = new List<IPasswordValidator<TUser>>(); pwdValidators.Add(passValidator); var userManager = new UserManager<TUser>(userPasswordStore.Object, options.Object, new PasswordHasher<TUser>(), userValidators, pwdValidators, new UpperInvariantLookupNormalizer(), new IdentityErrorDescriber(), null, new Mock<ILogger<UserManager<TUser>>>().Object); return userManager; } 请注意,如果您想从 UserManager 测试 CreateAsync,则应模拟 UserPasswordStore 有一个方法 (CreateAsync)。 密码和锁定设置取自我的项目。它们应该与您的设置保持同步,以便您可以测试真实的东西。 当然你不会测试例如PasswordValidator,但你可以测试你的方法,例如: //Part of user service public async Task<IdentityResult> Register(UserDto data) { SystemUser user = ConvertDtoToUser(data); IdentityResult result = userManager.CreateAsync(user, data.Password); //some more code that is dependent on the result }

回答 3 投票 0

ASP.NET Core MVC _userManager.FindByEmailAsync(Input.Email) 返回 null,尽管现有用户具有相同的电子邮件

我在 ASP.NET Core MVC 应用程序中实现密码重置功能时遇到问题。将重置令牌发送到用户的电子邮件并单击链接设置新密码后...

回答 1 投票 0

如何追踪失败的登录,然后屏蔽IP地址

我有一个 Blazor 服务器应用程序,它正在使用 ASP.NET Core 身份库(即 MVC)。 我想实现代码,以便如果远程 IP 地址在 15 分钟内登录失败 50 次,我...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.