在类库中添加Owin Facebook登录到现有应用程序

本文关键字:应用程序 登录 Facebook 类库 添加 Owin | 更新日期: 2023-09-27 18:07:36

我有一个类库,用于管理与MVC应用程序对应的不同项目。

有了这个教程,我可以做一个完整的MVC5网站与Facebook登录认证。

但是我想要的是将这种类型的身份验证(我认为它的Owin)集成到我的类库中,并且每个其他MVC项目(网站)都使用该库来执行身份验证。

我怎样才能做到这一点?首先是Owin集成,然后是我需要集成到我拥有的哪个项目?

我的解决方案结构是这样的:

Solution
   |--->DataModel (MyClassLibrary)
   |--->MVCApplication1
   |--->MVCApplication2
   |--->MVCApplicationX

所有mvcapapplication {something}都在使用数据模型,所以我的数据模型应该有在不同的mvcapapplication {something}网站登录所需的对象。

在类库中添加Owin Facebook登录到现有应用程序

如果您希望所有的User数据都经过您的DataModel,那么您确实需要做一些工作。我在上一个项目中就这样做了,它并没有那么糟糕,但是你确实需要做一些工作。

在阅读其余内容之前,先阅读这篇文章: http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity

默认情况下,ASP。. NET Identity将使用自己的独立数据库来保存登录信息,这是您不希望的(您希望它存储在DataModel中的一个地方)。

首先,您必须提供自己的IUserStore实现,并在您的mvapplication(通常在AccountController)中管理身份验证时使用它。

我会在你的解决方案中添加一个名为Authentication的新项目,它应该有一个类:

public class UserStore : IUserStore<IdentityUser, long>,
                             IUserLoginStore<IdentityUser, long>,
                             IUserPasswordStore<IdentityUser, long>,
                             IUserClaimStore<IdentityUser, long>

您必须实现接口中的所有方法,这些方法将调用到DataModel以获取用户数据或索赔数据(Facebook登录存储为针对IdentityUser的索赔)。

下面是你在DataModel中需要的类:

public class IdentityUser : IUser<long>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
    public virtual ICollection<ExternalLogin> Logins { get; set; }
    public virtual ICollection<UserClaim> Claims { get; set; } 
}
public class ExternalLogin
{
    [Key]
    public long Id { get; set; }
    public string LoginProvider { get; set; }
    public string ProviderKey { get; set; }
    public string UserName { get; set; }
    public virtual IdentityUser User { get; set; }
}
public class UserClaim
{
    [Key]
    public long Id { get; set; }
    public string Type { get; set; }
    public string Value { get; set; }
    public IdentityUser User { get; set; }
}

注意事项:我希望用户id是长,所以我扩展了IUser<long>。如果你喜欢字符串,你可以省略这里的类型参数,以及你为UserStore实现的所有接口。

UserManager是controller用来与你的认证系统交互的对象。它们与您提供了自定义实现的userstore对话。userstore与数据存储对话,在您的示例中,数据存储将是您的数据模型。

下面是使用自定义UserStore的AccountController的代码片段。您所要做的就是构造一个并将其传递给UserManager的构造函数。

public UserManager<IdentityUser, long> UserManager { get; private set; }
public AccountController()
{
    IUserStore<IdentityUser, long> userStore = new UserStore();
    UserManager = new UserManager<IdentityUser, long>(store);
}