asp.net-core-identity 相关问题

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

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

在Asp.net Core Identity中通过电话号码注册并登录

asp.net core身份注册登录可以不使用Email吗? 用户只需通过手机号码注册并通过短信验证登录即可。

回答 3 投票 0

如何在 ASP.NET Core MVC 中获取 Azure Active Directory 的应用程序角色?

我创建了一个新的 ASP.NET Core MVC 6.0 Web 应用程序,并将其定义为使用 Microsoft Identity Platform 进行身份验证,如下所示: 现在我读了这篇文章,它展示了我们如何定义不同的...

回答 2 投票 0

如何在一次数据库调用中加载具有角色的 ASP.NET Core Identity 用户

我们有一个方法来加载所有 ASP.NET Core Identity 用户 等待 _userManager.Users.ToListAsync() 我们还有一个方法来加载特定身份用户的角色: IList 用户角色 =

回答 1 投票 0

如何修复错误外键属性“ApplicationUserClaim.UserId1”是在影子状态下创建的

我正在使用 Microsoft.EntityFrameworkCore.SqlServer 8.0 Microsoft.AspNetCore.Identity.EntityFrameworkCore 8.0 我试图解决的总体问题是以下代码不适用于

回答 1 投票 0

如何在 .NET 8 中使用 Entity Framework Core 进行身份验证?

我正在关注 Nick Chapsas 的 YouTube 视频,题为“您必须了解的 .NET 8 Auth 更改!”。我在尝试运行命令时特别陷入时间索引 5:46 点网 ef

回答 1 投票 0

如何在 .NET 8 中使用 EntityFrameworkCore 进行身份验证?

我正在关注 Nick Chapsas 的 YouTube 视频,题为“您必须了解的 .NET 8 Auth 更改!”。我在尝试运行命令 dotnet ef 时特别陷入时间索引 5:46

回答 1 投票 0

Web API 中的 ASP.NET Core 身份

是否有关于如何为 Web API 设置 ASP.NET Core Identity 的指南? 我发现的所有内容都使用视图模型,并将注册/登录页面作为 RazorPage 显示在服务器上。 MS 的介绍文档...

回答 2 投票 0

如何在asp.net core razor网站中存储int userId

正在努力寻找一个合适的解决方案来跨多个页面访问 int userId 值 所以我不是专家。正当你觉得自己有能力的时候,这样的问题就会出现。 我有一个asp....

回答 1 投票 0

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 分钟。您可以将该值设置为较低的值。

回答 1 投票 0

使用多种身份验证方案时出现 NullReferenceException

根据配置的身份验证方式,JWT 或 AzureAD 身份验证可在受保护端点上运行,但其中之一总是失败,并显示“对象引用未设置到对象的实例”...

回答 1 投票 0

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