C# Asp.net标识的自定义实现。GetExternalAuthenticationTypes()返回0个提供程序

C# Asp.net标识的自定义实现。GetExternalAuthenticationTypes()返回0个提供程序,c#,asp.net-mvc,asp.net-identity,facebook-login,C#,Asp.net Mvc,Asp.net Identity,Facebook Login,我已经实现了自定义Asp.Net标识。为了使用我自己的数据库模型,而不是已经内置的模型。为此,我自定义实现了以下所有类/接口 AuthUser : IPrincipal, IUser<string> ApplicationSignInManager : SignInManager<AuthUserMVC, string> AuthUserManager : UserManager<AuthUserMVC> AuthUserStore : IUserStore&

我已经实现了自定义Asp.Net标识。为了使用我自己的数据库模型,而不是已经内置的模型。为此,我自定义实现了以下所有类/接口

AuthUser : IPrincipal, IUser<string>
ApplicationSignInManager : SignInManager<AuthUserMVC, string>
AuthUserManager : UserManager<AuthUserMVC>
AuthUserStore : IUserStore<AuthUserMVC>
这是DI的NInject代码

kernel.Bind<IUserStore<AuthUserMVC>>().To<AuthUserStore>().InRequestScope();
kernel.Bind<IAuthenticationManager>().ToMethod((c)=>HttpContext.Current.GetOwinContext().Authentication);
正在返回0个提供程序。它不应该这样做


我的自定义实现代码

public class ApplicationSignInManager : SignInManager<AuthUserMVC, string>
{
    public ApplicationSignInManager(
        AuthUserManager userManager, 
        IAuthenticationManager authenticationManager)
        : base(userManager, authenticationManager)
    {
    }

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(AuthUserMVC user)
    {
        return Task.FromResult(user.GetIdentity());
    }

    public static ApplicationSignInManager Create(
        IdentityFactoryOptions<ApplicationSignInManager> options, 
        IOwinContext context)
    {
        return new ApplicationSignInManager(context.GetUserManager<AuthUserManager>(), context.Authentication);
    }
}

public class AuthUserManager : UserManager<AuthUserMVC>
    {
        public AuthUserManager(IUserStore<AuthUserMVC> store) : base(store)
        {
        }

        public override Task<IdentityResult> AddClaimAsync(string userId, Claim claim)
        {
            return base.AddClaimAsync(userId, claim);
        }
    }
公共类应用程序SignInManager:SignInManager
{
公共应用程序SigningManager(
AuthUserManager用户管理器,
IAAuthenticationManager(身份验证管理器)
:base(userManager、authenticationManager)
{
}
公共覆盖任务CreateUserIdentityAsync(AuthUserMVC用户)
{
返回Task.FromResult(user.GetIdentity());
}
公共静态应用程序SigningManager创建(
IdentityFactoryOptions选项,
IOwinContext(上下文)
{
返回新的ApplicationSignInManager(context.GetUserManager(),context.Authentication);
}
}
公共类AuthUserManager:UserManager
{
公共AuthUserManager(IUserStore存储):基本(存储)
{
}
公共覆盖任务AddClaimeSync(字符串用户ID,索赔)
{
return base.addclairsync(userId,claim);
}
}

我做错了什么?

正如您可能知道的,当您实现自定义的AsNetIdentity提供程序时,您必须做很多事情。其中之一是实现AuthenticationOptions。如果您反编译GetExternalAuthenticationTypes方法的代码,您将看到它检查的部分内容是自定义AuthenticationOptions实现有一个名为“Caption”的属性。如果没有,则GetExternalAuthenticationTypes将不会返回它。

是的,我已经检查了它并添加了一个标题,但仍然不走运。我只是下载了源代码,而不是反编译。你知道吗?我认为问题很严重,但我不知道在哪里添加提供者。
Context.GetOwinContext()
  .Authentication
  .GetExternalAuthenticationTypes() 
public class ApplicationSignInManager : SignInManager<AuthUserMVC, string>
{
    public ApplicationSignInManager(
        AuthUserManager userManager, 
        IAuthenticationManager authenticationManager)
        : base(userManager, authenticationManager)
    {
    }

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(AuthUserMVC user)
    {
        return Task.FromResult(user.GetIdentity());
    }

    public static ApplicationSignInManager Create(
        IdentityFactoryOptions<ApplicationSignInManager> options, 
        IOwinContext context)
    {
        return new ApplicationSignInManager(context.GetUserManager<AuthUserManager>(), context.Authentication);
    }
}

public class AuthUserManager : UserManager<AuthUserMVC>
    {
        public AuthUserManager(IUserStore<AuthUserMVC> store) : base(store)
        {
        }

        public override Task<IdentityResult> AddClaimAsync(string userId, Claim claim)
        {
            return base.AddClaimAsync(userId, claim);
        }
    }