首页 > 解决方案 > 如何在 N 层解决方案中实现身份?

问题描述

这是一个关于如何在 N 层架构中实现 Identity 的一般性问题,因此请随时纠正我当前的实现或建议我如何解决当前遇到的问题。

我正在创建一个 ASP.net 核心网站,并且正在使用 N 层架构。

我已将解决方案分为 4 层:

我有点像没有桨的小溪,因为 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.IdentityUserClaim1[System.String]、Microsoft.AspNetCore.Identity.IdentityUserRole 1[System.String],Microsoft.AspNetCore.Identity.IdentityUserLogin1[System.String] 时,无法解析类型“DatabaseAccess.DatabaseContext”的服务, Microsoft.AspNetCore.Identity.IdentityUserToken 1[System.String],Microsoft.AspNetCore.Identity.IdentityRoleClaim1[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(我指定什么类型)?

标签: c#asp.netasp.net-coreasp.net-identity

解决方案


推荐阅读