我已经实现了自定义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);
}
}
我做错了什么?
答案 0 :(得分:0)
您可能已经意识到,当您实现自定义AspNetIdentity提供程序时,您必须执行许多操作。其中之一是实现AuthenticationOptions。如果您反编译GetExternalAuthenticationTypes方法的代码,您将看到它检查的部分内容是您的自定义AuthenticationOptions实现具有名为“Caption”的属性。如果没有,那么GetExternalAuthenticationTypes将不会返回它。