2014-06-06 50 views
0

我有一個類庫管理對應於MVC應用程序的不同項目。添加Owin Facebook登錄到類庫中的現有應用程序

With this tutorial我可以用Facebook登錄認證製作一個完整的MVC5網站。

但我想要的是將這種類型的身份驗證(我認爲它的Owin)集成到我的類庫中,並且每個其他MVC項目(網站)都使用此庫執行身份驗證。

我該如何做到這一點?首先是歐文整合,然後我需要整合到我擁有的項目中?

我的解決方案的結構是這樣的:

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

所有MVCApplication {}東西用數據模型,所以我的DataModel應該在不同的MVCApplication {}東西的網站,登錄所需要的對象。

回答

0

如果你想讓你的所有用戶數據都通過你的DataModel,你確實有一些工作要做。我在我的最後一個項目中做了這件事,並沒有那麼糟糕,但你必須做一些工作。

在您閱讀的這剩下的,請閱讀這篇文章:http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity

默認情況下,ASP.NET身份將使用自己單獨的數據庫扶住登錄信息,你不希望(你希望它存儲在你的DataModel中的一個地方)。

首先,您將不得不提供自己的IUserStore實現,並在MVCApplications(通常在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實現的所有接口上省略type參數。

UserManager是控制器用來與您的身份驗證系統進行交互的對象。他們與UserStores交談,您提供了自定義的實現。 UserStores與DataStore進行通信,在您的情況下,它將是您的DataModel。

下面是您的AccountController可能看起來像使用您的自定義UserStore的片段。你所要做的就是構造一個並將其傳遞給UserManager的構造函數。

public UserManager<IdentityUser, long> UserManager { get; private set; } 

public AccountController() 
{ 
    IUserStore<IdentityUser, long> userStore = new UserStore(); 
    UserManager = new UserManager<IdentityUser, long>(store); 
} 
+0

這是我想要的,但在我的新的身份驗證項目..我必須添加哪些nuget包? –

+0

新的認證項目應該只引用這個NuGet包:Microsoft.AspNet.Identity.Core –

+0

此外,你應該刪除對Microsoft.AspNet.Identity.EntityFramework的引用,因爲你現在提供你自己的實現(通過你的數據模型) –