asp.net身份自定义提供程序 - 无身份验证处理程序

时间:2016-06-20 12:35:10

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

我已经构建了一个自定义提供程序来支持组和nosql数据库。这一切似乎都与认证无关(帐户可以在没有问题的情况下最终创建)。 我应该注意我使用自己的实体类,这些类不是从identityuser继承的等。

我遇到的问题就是说运行例如var loginres = await this.signInManager.PasswordSignInAsync(" username"," paswd",false,false)给了我一个例外,

  

InvalidOperationException:未配置身份验证处理程序   处理方案:Identity.Application

我设置代码的方式如下:

services.AddIdentity<User, Role>()
                .AddUserStore<NoSqlUserStore<User, Role>>()
                .AddRoleStore<NoSqlRoleStore<Role>>()
                .AddUserManager<IdentityUserManager<User>>()
                .AddRoleManager<IdentityRoleManager<Role>>()
                .AddDefaultTokenProviders();

管理器类只继承用户和角色管理类,没有任何更改或添加atm。

public class IdentityUserManager<TUser> : UserManager<TUser>
        where TUser : User, new()
    {
        public IdentityUserManager(IUserStore<TUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<TUser> passwordHasher, IEnumerable<IUserValidator<TUser>> userValidators, IEnumerable<IPasswordValidator<TUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<IdentityUserManager<TUser>> logger)
            : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
        {
        }
    }

public class IdentityRoleManager<TRole> : RoleManager<TRole>
        where TRole : Role
    {
        public IdentityRoleManager(IRoleStore<TRole> store, IEnumerable<IRoleValidator<TRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<TRole>> logger, IHttpContextAccessor contextAccessor)
            : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
        {
        }
    }

商店的签名如下:

public class NoSqlRoleStore<TRole> : RoleStoreBase, IRoleStore<TRole>
        where TRole : Role, new()
    {

    }

public class NoSqlUserStore<TUser, TRole> : UserStoreBase<TUser>, //todo: include groups in rolechecking
        IUserLoginStore<TUser>,
        IUserRoleStore<TUser>,
        IUserClaimStore<TUser>,
        IUserPasswordStore<TUser>,
        IUserSecurityStampStore<TUser>,
        IUserEmailStore<TUser>,
        IUserLockoutStore<TUser>,
        IQueryableUserStore<TUser>,
        IUserTwoFactorStore<TUser>,
        IUserAuthenticationTokenStore<TUser>
        where TUser : User, IEntity, new() where TRole : Role, IEntity, new()
    {

    }

当然它们包含所有接口方法,它编译,运行和工作除了错误。用户和角色类是普通实体,有点类似于提供的实体。

我的猜测是我缺少一些配置设置(即使,据我所见,该身份应提供有关此的工作默认值?)或其他东西。我从未在默认实体框架提供程序之外使用身份。但我希望有人知道这里需要什么? (如果需要更多的代码来说明情况,请修复它)

2 个答案:

答案 0 :(得分:2)

您应该定义自定义UserStore

public class MyUserStore : IUserStore<CustomUser,int>,
    IUserPasswordStore<CustomUser,int>, 
    IUserSecurityStampStore<CustomUser, int>,
    IUserLoginStore<CustomUser, int>,IUserRoleStore<CustomUser,int>
        {
            //interfaces implementations
        }

其中CustomUser是实现TUser界面和&#39; int&#39;的用户类。是你的初始关键字段的类型

如果您使用字符串主键

IUserStore<CustomUser>

比需要定义CustomUserManager

  public class CustomUserManager: UserManager<CustomeUser,int> // UserManager<CustomeUser> if primary is string
    {

    }

答案 1 :(得分:1)