2014-09-06 47 views
8

我正在使用微軟的Asp.Net Identity Framework版本2,並且正在實施我自己的IUserStore。我的新類MyUserStore實現了IUserStore<MyUserClass,int>接口和IUserPasswordStore<MyUserClass,int>,這是與UserManager<MyUserClass,int>類一起使用所需的。或者說,至少這是我從閱讀教程聚集像this實現您自己的IUserStore時,該類上的「可選」接口實際上是否可選?

「的身份系統中的一個必需的接口是IUserStore」 - 斯科特 - 阿倫

但是,這似乎並沒有這樣的情況當我運行代碼。

我初始化我的經理:

var uMan= new UserManager<MyUserClass, int>(new MyUserStore()); 
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin); 

而當執行sMan.PasswordSignIn(...)的SignInManager,無論怎樣,SignInManager始終在依賴於可選接口的UserManager功能。下面是從SignInManager類PasswordSignInAsync方法來源:

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout) 
     { 
      ... 
      if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture()) 
      { 
       return SignInStatus.LockedOut; 
      } 
      if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture()) 
      { 
       return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture(); 
      } 
      ... 
      return SignInStatus.Failure; 
     } 

它總是調用UserManager.IsLockedOutAsync()之前它試圖檢查密碼,如果店裏沒有實現IUserLockoutStore接口,異常得到無論什麼時候拋出每一次。

這是否意味着要使用UserManager和SignInManager類的默認功能,您需要實現每個I * Store接口?

看起來解決方法是繼承SignInManager並重寫PasswordSignInAsync方法。這是標準做法嗎?

謝謝!

+0

在GitHub上查看源代碼的最新版本,該問題已得到解決(https://github.com/aspnet/Identity/blob/c9d27e27e6dd6c15b4228de6e5de3c1a22c15a6d/src/Microsoft.AspNet.Identity/SignInManager.cs#L94)。顯然,這對目前的版本沒有幫助,但我們將來會看到這一點。 – 2015-01-06 16:08:47

回答

6

我發現Identity框架與所需I * Store的「可選性」不一致。在一些公共方法中,它會檢查是否提供了所需的Store,並在其他一些地方調用該方法。我還沒有弄清楚哪些是絕對需要的,哪些是不能調用的。所以我會隨着異常線索去執行任何應用程序所需的商店。

+1

看起來他們試圖擺脫會員資格的情況,在那裏你有單一的界面與百種方法來實現,但沒有成功 - 他們把所有東西都分割成更小的界面,但是在結果中你仍然擁有巨大的UserStore類。 – Giedrius 2016-03-02 15:56:21

+0

我不認爲MembershipProvider中有任何接口。 'UserStore'類是他們自己的實現細節。如果你正在自己實施,你可以有許多小班。 – trailmax 2016-03-02 17:13:47

+1

對於MembershipProvider,你是對的,它不是一個接口,而是抽象類,在目前的情況下,我認爲這不重要,因爲你必須在這裏和這裏實現所有的東西。關於UserStore - 我自己儘可能小(只是爲了能夠使用SignInManager),沒有包含任何我不需要的東西,它現在仍然包含19種方法,我猜這是目前最低限度。 – Giedrius 2016-03-03 06:27:16

相關問題