c# - 如何在 N 层解决方案中实现身份?
问题描述
这是一个关于如何在 N 层架构中实现 Identity 的一般性问题,因此请随时纠正我当前的实现或建议我如何解决当前遇到的问题。
我正在创建一个 ASP.net 核心网站,并且正在使用 N 层架构。
我已将解决方案分为 4 层:
- 核心层
- POCO的
- 存储库和服务的接口。
- 业务逻辑层
- 服务实现
- 数据访问层
- 实体
- 存储库实现
- 表示层
我有点像没有桨的小溪,因为 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.IdentityUserRole1[System.String],Microsoft.AspNetCore.Identity.IdentityUserLogin
1[System.String] 时,无法解析类型“DatabaseAccess.DatabaseContext”的服务, Microsoft.AspNetCore.Identity.IdentityUserToken1[System.String],Microsoft.AspNetCore.Identity.IdentityRoleClaim
1[System.String]]'。
一些信息:
UserEntity 仅在 DAL 中使用,并转换为 User poco。
用户实体
public class UserEntity : IdentityUser
{
public CompanyEntity Company { get; set; }
}
用户(Atm。与 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(我指定什么类型)?
解决方案
推荐阅读
- python - 使用 tensorflow 的 .ckpt 模型
- ffmpeg - 在android cmake中调用native.cpp中的ffmpeg.c函数
- azure-functions - Function App - 由于对象的当前状态,操作无效
- php - 我在 mysql pdo 上遇到了一些奇怪的错误。我该如何解决?
- javascript - 如何将锥体的位置设置为 vector3 变量?(三.js)
- python - 使用python从图像中去除背景:具有多个元素的数组的真值不明确
- activerecord - 如何使用活动记录在 yii2 中的一个事务中进行多次删除或更新或插入
- java - HTTP 500 作为对使用 Spring 控制器的 HTTP Post 请求的响应
- c - 可以解释一下字符串输入期间 (%*[\n] %[^\n]) 的使用吗
- python - 损失函数测试