2016-09-26 90 views
0

我們正在開發一個MVC5系統,該系統將具有一個網站和一個Web API。身份驗證方法將使用個人帳戶/本地登錄的asp.net身份。帳戶的多種登錄方法

網站需要標準用戶/密碼進行登錄。

在Web API將通過手持設備中使用(帶集成條碼掃描器Windows CE設備)和用戶故事定義了一個PIN(4-6數字號碼)將比該設備上的複雜密碼更可取。

相同的userId將有一個複雜的密碼登錄到網站,最好是一個PIN登錄到掌上電腦。

我創建了一個相對簡單的解決方案,即在用戶註冊時創建2個帳戶。

一個用戶名爲「MART0001」的普通用戶帳戶,只能在網站上接受。

帶字符附加到用戶名「MART0001_ ^」末尾的高級帳戶。輔助帳戶可以具有PIN密碼,並且只有在從Web API調用時纔會被接受。

這並不理想,因爲我不得不放鬆ApplicationUserManager的PasswordValidator規則以允許接受PIN並管理我自己的複雜字符密碼驗證規則以輸入主帳戶密碼。

我還必須通過允許重置其中一個/兩個帳戶來管理忘記密碼/ PIN的用戶。

任何人都可以想到更優雅的解決方案嗎?

回答

1

當然。擁有一個用戶的兩個用戶帳戶是站不住腳的。如果您可以管理它,保持帳戶同步將是一場噩夢。將引腳作爲單獨的列添加,並在提供引腳時執行自定義身份驗證。基本上,您只需選擇使用類似UserManager.FindByEmailAsync而不是UserManager.PasswordSignInAsync的用戶。然後,您手動檢查引腳是否匹配。如果有,請用SignInManager.SignInAsync對用戶進行簽名。如果不是,則返回典型登錄失敗錯誤消息。

當然,你應該將引腳散列在數據庫中,並將其與用戶輸入引腳的散列值進行比較,與密碼處理相同。您應該能夠使用UserManager.PasswordHasher.HashPasswordUserManager.PasswordHasher.VerifyHashedPassword來散列存儲在數據庫中的引腳,並分別驗證用戶輸入的引腳。

當銷被設定

user.Pin = UserManager.PasswordHasher.HashPassword(pin); 

當與銷登錄

var user = UserManager.FindByNameAsync(username); 
if (user != null && UserManager.PasswordHasher.VerifyHashedPassword(user.Pin, pin)) 
{ 
    await SignInManager.SigInAsync(user, isPersistent, rememberBrowser); 
    // redirect 
} 

// return error