2010-07-10 76 views
29

我正在構建一個ASP.NET MVC網站,我想使用DotNetOpenAuth來實現OpenID登錄(我徹底刪除了用戶名/密碼登錄)。使用OpenID(通過DotNetOpenAuth)以及用戶角色和其他Membership Provider功能

到目前爲止,我一直在使用角色系統,配置文件系統和基本註冊系統爲ASP.NET成員提供程序編寫默認用戶名/密碼系統的代碼。現在,在我轉移到OpenID的過程中,我預見了一些問題,特別是與對接,由ASP.NET會員供應商提供的會員控制。

看看DotNetOpenAuth MVC示例,我看到對FormsAuthentication系統的唯一引用是創建一個AuthCookie,稍後再調用FormsAuthentication.SignOut()。因此,雖然示例代碼的另一部分調用User.Identity.IsAuthenticated,但我不確定是否可以將ASP.NET Membership Provider函數用於此OpenID系統。


這個OpenID系統與ASP.NET Membership Provider接口嗎?如果不是,我可以以某種方式解決這個問題嗎?

如果上述是完全不可能的,我認爲我的下一步行動將只是滾動我自己的數據庫表,並手動編寫代碼以使用它們從我的帳戶控制器。我注意到Stack Exchange Data Explorer採取這種方法,但這是否是正確的行動方針?


編輯:只是要確保我使用的是正確的術語,通過「ASP.NET成員資格提供」,我的意思是使用由aspnet_regsql.exe工具生成的表格的提供者。

回答

40

他們將接口很好,但你需要做一些自定義工作。

我過去所做的是這樣的:

首先,我假設你有一個半工作OpenID的實施,這意味着你可以從一個OpenID提供商收到的實際身份,但只是不知道做什麼用它。

我繼續使用FormsAuthentication作爲後端,即使沒有用於身份驗證。

您將需要一個數據庫表,允許您將FormsAuthentication用戶綁定到一個或多個openid。您可以簡單地將FormsAuthentication用戶名(尚不存在)存儲在您從openid提供商處收到的身份URL中。我們將稱此表爲AUTH

當某人用openid檢查您的站點是否存在於AUTH表中時。如果不是,你需要做兩件事。調用Membership.CreateUser()傳遞你想要的任何生成的用戶名(或者電子郵件地址,如果由openid提供的話)。我用密碼的GUID,因爲它不會被使用。同時在AUTH表中輸入一個條目,將成員資格用戶名映射到openid聲明的身份。

當某人使用開放標識向您的網站進行身份驗證並且它已經存在時,將調用FormsAuthentication.RedirectFromLoginPage以及與該openid關聯的用戶名,並設置所有相應的身份驗證標籤。

現在,您可以在實現openid之前像使用安全對象一樣使用所有內置的安全對象。

編輯: 作爲此設置的一個附加好處,您可以選擇在將來允許用戶名/密碼登錄。

您也可以隨時換出您的會員供應商。

此外,AUTH表的多對一性質使您可以輕鬆關聯多個公開ID。

+0

精彩回答 - 今天即將實施。非常感謝! – 2010-07-12 18:04:56

+1

我仍然可以使用'Membership.GetUser()',對吧? – 2010-07-12 23:23:07

+0

是的,你仍然可以使用Membership.GetUser()。 只要您將用戶名傳遞給RedirectFromLoginPage,您就基本上等於通過內置登錄控件發生的情況。 – jwsample 2010-07-13 02:40:18

相關問題