自定义实施Asp.net IDentity。 GetExternalAuthenticationTypes()返回0提供者

时间:2015-09-16 15:09:21

标签: c# asp.net-mvc asp.net-identity facebook-login

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

AuthUser : IPrincipal, IUser<string>
ApplicationSignInManager : SignInManager<AuthUserMVC, string>
AuthUserManager : UserManager<AuthUserMVC>
AuthUserStore : IUserStore<AuthUserMVC>

使用它来使用NInject在我的AccountController中注入所需的依赖项。 AccountController的构造函数签名是

public AccountController(
            UsersRepository usersRepository,
            AuthUserManager authUserManager,
            AuthUserStore authUserStore,
            ApplicationSignInManager signInManager)
        {

            this.UsersRepository = usersRepository;
            this.SignInManager = signInManager;
            this.UserManager = authUserManager;
            this.UserStore = authUserStore;
        }

这是DI的NInject代码

kernel.Bind<IUserStore<AuthUserMVC>>().To<AuthUserStore>().InRequestScope();
kernel.Bind<IAuthenticationManager>().ToMethod((c)=>HttpContext.Current.GetOwinContext().Authentication);

获取帐户/登录时 - 开箱即用标识的正常过程 我没有看到列出的任何外部登录提供商。那是因为在 _ExternalLoginsListPartial.cshtml

Context.GetOwinContext()
  .Authentication
  .GetExternalAuthenticationTypes() 

正在返回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);
        }
    }

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您可能已经意识到,当您实现自定义AspNetIdentity提供程序时,您必须执行许多操作。其中之一是实现AuthenticationOptions。如果您反编译GetExternalAuthenticationTypes方法的代码,您将看到它检查的部分内容是您的自定义AuthenticationOptions实现具有名为“Caption”的属性。如果没有,那么GetExternalAuthenticationTypes将不会返回它。