自定义ASP.NET标识,OWIN和社交提供程序登录

时间:2014-07-18 08:23:20

标签: asp.net-mvc-5 asp.net-identity owin

我是ASP.NET MVC 5和OWIN的新手。

我已将项目升级到MVC 5以实现项目的身份验证和授权。问题是我的项目没有存储用户数据。当用户登录时,我通过WCF服务询问另一个系统,告诉我用户是否经过身份验证。所以我没有数据库,也没有存储用户的表。

但我想添加使用OWIN通过社交提供商登录的功能。为此,我将添加一个本地数据库表来存储社交提供者Id / Token

环顾其他人已经问过类似的问题,但只有当他们想要更改数据库类型存储时...虽然我实际上并不存储数据...是否仍然可以使用ASP.NET身份和我该怎么做?

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

如果您不想实现自己的IUserStore,您仍然可以使用内置的默认基于EF的UserStore,并且只使用外部登录apis。数据库模式将有一堆列始终为null,如PasswordHash等,但您关注的操作仍然可以正常工作:

CreateAsync(TUser) - Create a user
AddLoginAsync(userId, UserLoginInfo) - Associate an external login
FindAsync(UserLoginInfo) - Return the user with the associated external login

答案 2 :(得分:0)

您必须提供UserStore并将其传递给UserManager,如果您已在默认的mvc5项目中使用entityframework,则可以编写继承自Microsoft.AspNet.Identity.EntityFramework.UserStore的CustomUserStore并覆盖定义的方法在Microsoft.AspNet.Identity.EntityFramework.IUserLoginStore中:

public interface IUserLoginStore<TUser, in TKey> : IUserStore<TUser, TKey>, IDisposable where TUser : class, Microsoft.AspNet.Identity.IUser<TKey>
{
   Task AddLoginAsync(TUser user, UserLoginInfo login);
   Task<TUser> FindAsync(UserLoginInfo login);
   Task<Collections.Generic.IList<UserLoginInfo>> GetLoginsAsync(TUser user);
   Task RemoveLoginAsync(TUser user, UserLoginInfo login);
}

如果你不使用entityframework,你必须提供自己的访问数据库的方法,编写一个实现IUserStore,IUserLoginStore,IUserClaimStore,IUserRoleStore,IUserPasswordStore,IUserSecurityStampStore的UserStore(取决于你的需要,但至少IUserStore和IUserLoginStore作为IUserStore是必需的,IUserLoginStore是你想要添加的东西)

所有这些接口都在Microsoft.AspNet.Identity名称空间中。

here如何实现自定义MySQL ASP.NET身份存储提供程序和 here如何使用Dapper ORM而不是EntityFramwework。

答案 3 :(得分:0)

我查看了建议的解决方案。我发现要实现的接口的方法名称并不适合,并且在哪里也有太多的方法。

我最终只使用AccountController中的OWIN Context来提取具有我想要的所有细节的LoginInfo。这样我就不必实现任何自定义版本的IUserLoginStore等......

我想要最简单的解决方案来实现,因此我最终得到了: 1.从模板mvc项目添加了StartupAuth类,并在那里配置了不同的提供程序 1.在AccountController中:从LoginInfo中提取声明, 2.将OpenId存储在表中以供查找,然后继续进行。