簡體   English   中英

自定義實現的Asp.net IDentity。 GetExternalAuthenticationTypes()返回0提供程序

[英]Custom Implementation of Asp.net IDentity. GetExternalAuthenticationTypes() Returning 0 Providers

我已經實現了自定義Asp.Net身份。 為了使用我自己的數據庫模型,而不是已經內置的數據庫模型。 為此,我自定義實現了以下所有類/接口。

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

使用It im使用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);
        }
    }

我究竟做錯了什么?

如您所知,實現自定義AspNetIdentity提供程序時,您必須做很多事情。 其中之一是實現AuthenticationOptions。 如果您反編譯GetExternalAuthenticationTypes方法的代碼,您將看到它檢查的部分內容是自定義AuthenticationOptions實現具有名為“ Caption”的屬性。 如果不是,那么GetExternalAuthenticationTypes將不會返回它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM