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

时间:2018-08-22 13:22:24

标签: c# asp.net asp.net-core asp.net-identity

这是一个关于如何在N层体系结构中实现身份的一般性问题,因此可以随时纠正我的当前实现或建议我如何解决当前遇到的问题。< / strong>

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

我将解决方案分为4层:

  • 核心层
    • POCO的
    • 存储库和服务的接口。
  • 业务逻辑层
    • 服务实施
  • 数据访问层
    • 实体
    • 存储库实现
  • 演示层

我有点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”的服务。 IdentityUserRole 1[System.String],Microsoft.AspNetCore.Identity.IdentityUserLogin 1 [System.String],Microsoft.AspNetCore.Identity.IdentityUserToken 1[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(我指定哪种类型)?

0 个答案:

没有答案