使用ASP.NET Core Identity将登录功能添加到ASP.NET Core应用程序。
ASP.NET Core Identity,创建登录、注册操作。 AuthController
公共类AuthController:控制器 { SignInManager _signInManager { 获取; } UserManager _userManager { 获取; } RoleManager _roleMan...
ASP.NET Core Identity - 帐户控制器和文件夹在哪里
我是 .NET Core 的新手,想询问有关身份的问题。 我买了一本书并遵循了所有说明。按照书中描述的方式设置 Identity 非常简单。 创建一个帐户控制器,
.NET Core 5 Razor Pages Cookie 身份验证登录成功后重定向到登录页面
我使用“个人身份验证”创建了一个 ASP.NET Core Razor Pages Web 应用程序。然后我添加了身份脚手架并运行应用程序,它要求“应用迁移”我...
如何在设计时将接口注入到 DbContext 的构造函数中 ASP.NET Core Identity
我需要在设计时将 ICurrentTenantRepository 接口的实例传递到我的 AppDbContext 类的构造函数中,但我不知道该怎么做。我对
我有一个 ASP.NET Core 站点,使用 AspNetCore.Identity.EntityFrameworkCore 1.1.1 和 cookie 来授权/验证我的用户。无论我在下面的代码中选择什么设置,cookie
如何让 ASP.NET Core 身份电话号码显示在个人资料页面上?
我将 ASP.NET Core 身份实现到应用程序中,并实现了角色,一切都运行良好。我将电话号码添加为用户注册时的必填字段,它正在写入 SQL 数据...
将 .NET Core Identity 与 API 结合使用
我创建了一个 API 并从同一 API 设置了 JWT 身份验证(我选择不使用 IdentityServer4)。 我通过 services.AddAuthentication 做到了这一点 然后我在控制器中创建了令牌并且它起作用了。
我有以下代码。我正在尝试运行创建用户的测试用例。以下是我到目前为止所尝试的。 公共类 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 }
ASP.NET Core MVC _userManager.FindByEmailAsync(Input.Email) 返回 null,尽管现有用户具有相同的电子邮件
我在 ASP.NET Core MVC 应用程序中实现密码重置功能时遇到问题。将重置令牌发送到用户的电子邮件并单击链接设置新密码后...
我有一个 Blazor 服务器应用程序,它正在使用 ASP.NET Core 身份库(即 MVC)。 我想实现代码,以便如果远程 IP 地址在 15 分钟内登录失败 50 次,我...
在Asp.net Core Identity中通过电话号码注册并登录
asp.net core身份注册登录可以不使用Email吗? 用户只需通过手机号码注册并通过短信验证登录即可。
如何在 ASP.NET Core MVC 中获取 Azure Active Directory 的应用程序角色?
我创建了一个新的 ASP.NET Core MVC 6.0 Web 应用程序,并将其定义为使用 Microsoft Identity Platform 进行身份验证,如下所示: 现在我读了这篇文章,它展示了我们如何定义不同的...
如何在一次数据库调用中加载具有角色的 ASP.NET Core Identity 用户
我们有一个方法来加载所有 ASP.NET Core Identity 用户 等待 _userManager.Users.ToListAsync() 我们还有一个方法来加载特定身份用户的角色: IList 用户角色 =
如何修复错误外键属性“ApplicationUserClaim.UserId1”是在影子状态下创建的
我正在使用 Microsoft.EntityFrameworkCore.SqlServer 8.0 Microsoft.AspNetCore.Identity.EntityFrameworkCore 8.0 我试图解决的总体问题是以下代码不适用于
如何在 .NET 8 中使用 Entity Framework Core 进行身份验证?
我正在关注 Nick Chapsas 的 YouTube 视频,题为“您必须了解的 .NET 8 Auth 更改!”。我在尝试运行命令时特别陷入时间索引 5:46 点网 ef
如何在 .NET 8 中使用 EntityFrameworkCore 进行身份验证?
我正在关注 Nick Chapsas 的 YouTube 视频,题为“您必须了解的 .NET 8 Auth 更改!”。我在尝试运行命令 dotnet ef 时特别陷入时间索引 5:46
是否有关于如何为 Web API 设置 ASP.NET Core Identity 的指南? 我发现的所有内容都使用视图模型,并将注册/登录页面作为 RazorPage 显示在服务器上。 MS 的介绍文档...
如何在asp.net core razor网站中存储int userId
正在努力寻找一个合适的解决方案来跨多个页面访问 int userId 值 所以我不是专家。正当你觉得自己有能力的时候,这样的问题就会出现。 我有一个asp....
ASP.NET Core 7 Identity + JWT 身份验证无法正常工作
寻找解决方案! 将 ClockSkew 设置为 TimeSpan.Zero 我想使用 ASP.NET Core Identity 框架并通过 JWT 进行身份验证。 我已经注入了身份: builder.Services.AddIdentity 寻找解决方案! 将 ClockSkew 设置为 TimeSpan.Zero 我想使用 ASP.NET Core Identity 框架并通过 JWT 进行身份验证。 我已注入身份: builder.Services.AddIdentity<AppUser, IdentityRole>(options => { options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireLowercase = false; options.Password.RequireDigit = false; options.Password.RequiredUniqueChars = 1; options.Password.RequiredLength = 8; options.Lockout.AllowedForNewUsers = true; options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"; }) .AddEntityFrameworkStores<ApplicationDbContext>(); 和 JWT 中间件: builder.Services .AddAuthentication(options => { options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, config => { var _configuration = builder.Configuration; JwtSettings jwtSettings = _configuration.GetSection("Auth").Get<AuthSettings>()!.Jwt; // We already check null var secretKey = jwtSettings.Key; config.TokenValidationParameters = new TokenValidationParameters() { ValidIssuer = jwtSettings.Issuer, ValidAudience = jwtSettings.Audience, ValidateAudience = true, ValidateIssuer = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)), ClockSkew = TimeSpan.Zero // since by default the token is valid for 5 minutes, // you need to manually configure these properties, // which is why you can make the token valid for less than 5 minutes }; }); 控制器有一个 Login 方法,其属性为 [Authorize]: [Authorize()] [HttpGet()] public IActionResult Secret() { return Ok(); } 世代代币 public string GenerateAccessToken(IEnumerable<Claim> claims) { var jwtSettings = _authSettings.Jwt; var secretKey = jwtSettings.Key; var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( jwtSettings.Issuer, jwtSettings.Audience, claims, expires: DateTime.Now.ToUniversalTime(),, signingCredentials: signingCredentials ); return new JwtSecurityTokenHandler().WriteToken(token); } 但是当我发送带有已过期令牌的请求时,它会得到验证。在 TokenService 中,我生成了过期日期为“现在”的 JWT。 我使用 UserManager 和 SignInManager 来授权用户。 有什么问题吗? 我已经尝试过更改 Identity 和 JWT 实现的顺序。 TokenValidationParameters.ClockSkew的默认值为 5 分钟。您可以将该值设置为较低的值。
使用多种身份验证方案时出现 NullReferenceException
根据配置的身份验证方式,JWT 或 AzureAD 身份验证可在受保护端点上运行,但其中之一总是失败,并显示“对象引用未设置到对象的实例”...