这是一个关于如何在N层体系结构中实现身份的一般性问题,因此可以随时纠正我的当前实现或建议我如何解决当前遇到的问题。< / strong>
我正在创建一个ASP.net核心网站,并且正在使用N层体系结构。
我将解决方案分为4层:
我有点without不休,因为Identity的文档似乎有些晦涩,或者至少似乎针对特定用例。
我已经在BLL中安装了“ Microsoft.AspNetCore.Identity ” NuGet程序包,并在DAL中安装了“ Microsoft.AspNetCore.EntityFrameworkCore ” NuGet程序包。身份已连接到我的数据库并添加了自己的表。这样就建立了连接。
问题/场景:
我的问题是我可能没有正确实现Identity,但是更具体地说,当我尝试从BLL中的服务使用Identity SignInManager时遇到错误。
我提供以下服务:
public class LoginService : ILoginService
{
private readonly SignInManager<User> signInManager;
public LoginService(SignInManager<User> signInManager)
{
this.signInManager = signInManager;
}
public async Task<SignInResult> Login(string username, string password) => await signInManager.PasswordSignInAsync(username, password, true, true);
public async Task Logout() => await signInManager.SignOutAsync();
}
该服务应该使用Identity SignInManager(这是一个通用类,我认为默认情况下是使用/接受实体“ UserEntity”的设置)来使用户签入/签出。理想情况下,我应该能够像这样使用SignInManager:
SignInManager<User>
但是我当然会遇到以下错误:
System.InvalidOperationException:尝试激活“ Services.Services.LoginService”时,无法解析类型为“ Microsoft.AspNetCore.Identity.SignInManager`1 [Core.Models.User]”的服务。
如果我将LoginService逻辑委托给DAL中的“中间类”,那么我就可以使用UserEntity,那么我会收到以下错误消息:
System.InvalidOperationException:尝试激活“ Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore
9[DatabaseAccess.Entities.UserEntity,Microsoft.AspNetCore.Identity.IdentityRole,DatabaseAccess.DatabaseContext,System.String,Microsoft.AspNetCore.Identity.IdentityUserClaim
1 [System.String],Microsoft.AspNetCore.Identity时,无法解析类型为“ DatabaseAccess.DatabaseContext”的服务。 IdentityUserRole1[System.String],Microsoft.AspNetCore.Identity.IdentityUserLogin
1 [System.String],Microsoft.AspNetCore.Identity.IdentityUserToken1[System.String],Microsoft.AspNetCore.Identity.IdentityRoleClaim
1 [System.String]]'。
一些信息:
UserEntity仅在DAL中使用,并转换为User poco。
UserEntity
public class UserEntity : IdentityUser
{
public CompanyEntity Company { get; set; }
}
用户(与IdentityUser具有相同的道具)
public class User
{
public string Id { get; set; }
public string UserName { get; set; }
public DateTimeOffset? LockoutEnd { get; set; }
public bool TwoFactorEnabled { get; set; }
public bool PhoneNumberConfirmed { get; set; }
public string PhoneNumber { get; set; }
public string ConcurrencyStamp { get; set; }
public string SecurityStamp { get; set; }
public string PasswordHash { get; set; }
public bool EmailConfirmed { get; set; }
public string NormalizedEmail { get; set; }
public string Email { get; set; }
public string NormalizedUserName { get; set; }
public bool LockoutEnabled { get; set; }
public int AccessFailedCount { get; set; }
}
实际问题:
那么我是否正确地实施了身份标识,还是应该以不同的方式实现身份标识?
此外,如何正确使用SignInManager(我指定哪种类型)?