這裏要理解的最重要的事情是OpenID提供者不以任何方式控制用戶會話。它只會爲您提供與該用戶關聯的用戶標識符。或者,您也可以請求一些關於用戶的數據。這意味着您不必管理除用戶的OpenID標識符以外的任何用戶數據。在大多數情況下,您希望將該標識符與數據庫中的用戶關聯起來,但這不是絕對必要的。
但是你必須自己管理會話。當您使用OpenID登錄時,並不知道您實際登錄過的線索。它只知道您一直在與提供商進行通信。這意味着應用了AuthorizeAttribute
的mvc動作仍然不會被解僱。對於你不得不發出FormsAuthenticationTicket
像這樣:
private void IssueFormsAuthenticationTicket(string identifier, bool rememberMe)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, //version
identifier, //name
DateTime.Now, //issue date
DateTime.Now.AddDays(14), //expiration date
rememberMe, //is presistant
identifier //user data
);
//Now we encrypt the ticket so no one can read it...
string encTicket = FormsAuthentication.Encrypt(ticket);
//...make a cookie and add it. ASP.NET will now know that our user is logged in.
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
}
這是這個simples版本。然後您可以使用User.Identity.Name
訪問標識符數據。
如果您想要將某些用戶數據存儲在您的數據庫中,您可以通過註冊表單執行此操作,該表單遵循OpenID登錄並將標識符鏈接到該帳戶(您也可以選擇支持將多個OpenID標識符鏈接到單個帳戶)。正如我所提到的,您還可以向提供者請求一些數據並將其用於自動註冊。但要小心,因爲即使你說你必須擁有它,所有提供者並不總是提供一切。
Google僅舉例說明了您需要標記的數據。我只是忽略了所有你希望得到的數據請求,但你實際上並不需要。如果用戶將其填入自己的角色,MyOpenID將爲您提供所有需要或要求標記的數據。但是,如果用戶的角色沒有標記爲必需的數據,則登錄甚至會成功。
在我看來,在ASP.NET MVC中做OpenID是最好的DotNetOpenAuth。他們也有MVC的樣本,這是最簡單的,但它的工作原理。該示例雖然不顯示如何請求關於用戶的數據,但您可以在NerdDinner中找到該數據。
好的。那麼最好的方法是通過他們的開放ID登錄這個僞用戶嗎? – Ciel 2010-04-02 13:30:48
這是如何與密碼等工作? – Ciel 2010-04-02 13:33:04
完全取決於您的應用程序以及您如何處理登錄過程。我敢打賭,將openId數據存儲在某個地方,並將用戶擁有的其他所有內容鏈接到此表。您的普通用戶將擁有不同的表格,這些表格將鏈接到相同的數據。這樣,您可以將一個配置文件鏈接到任意數量的登錄提供程序。 – 2010-04-02 13:35:05