2011-04-20 119 views
1

在使用OpenId的網站中跟蹤當前用戶的建議解決方案是什麼?假設我有一個用戶表,其中包含一個ID和一個聲明的標識符,然後是我的網站特定信息,用戶希望更新他們的網站特定信息。跟蹤當前用戶的最佳方式是什麼,因爲我沒有使用內置成員資格?每當用戶嘗試更新他們的個人資料時,我是否應該向openid發送一個請求以獲取ClaimedIdentifier?或者,也許只是強制UserName是唯一的,並獲取基於User.Identity.Name的用戶信息?OpenId更新配置文件信息

回答

1

我用一個cookie做到這一點:)......你可能會發現我的回答有用:What OpenID solution is really used by Stack Overflow?

我也做了一個簡單的博客文章吧:http://codesprout.blogspot.com/2011/03/using-dotnetopenauth-to-create-simple.html

public class User 
{ 
    [DisplayName("User ID")] 
    public int UserID{ get; set; } 

    [Required] 
    [DisplayName("Open ID")] 
    public string OpenID { get; set; } 

    [DisplayName("User Name")] 
    public string UserName{ get; set; } 
} 

在我的例子我與OpenID登錄,然後我將其存儲在cookie中,但是,你可以存儲在cookie中的其他信息,如用戶名:

public class FormsAuthenticationService : IFormsAuthenticationService 
{ 
    public void SignIn(string userName, bool createPersistentCookie) 
    { 
     if (String.IsNullOrEmpty(serName)) throw new ArgumentException("The user name cannot be null or empty.", "UserName"); 

     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 
} 

更新2.0:
如何這樣的事情(這是視圖):

<% 
    if (Request.IsAuthenticated) 
    { 
     string name = Request.Cookies[Page.User.Identity.Name] == null ? string.Empty : Request.Cookies[Page.User.Identity.Name].Value; 
     if (string.IsNullOrEmpty(name)) 
     { 
      name = Page.User.Identity.Name; 
     } 
%> 

     [<%: Html.ActionLink(name, "Profile", "User")%> | 
     <%: Html.ActionLink("Log out", "LogOut", "User") %> | 
<% 
    } 
    else 
    { 
%> 
     [ <%: Html.ActionLink("Log in", "LogIn", "User") %> | 
<% 
    } 

%> 

和控制器,想必你您登錄(或者你可以設置Response.Cookies後帶到Profile頁在LogIn法),當你加載了你的模型在cookie中設置的顯示名稱:

[Authorize] 
    [HttpGet] 
    public ActionResult Profile(User model) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      userRepository.Refresh(); 
      model = userRepository.FetchByOpenID(User.Identity.Name); 

      // If the user wasn't located in the database 
      // then add the user to our database of users 
      if (model == null) 
      { 
       model = RegisterNewUser(User.Identity.Name); 
      } 

      Response.Cookies[model.OpenID].Value = model.DisplayName; 
      Response.Cookies[model.OpenID].Expires = DateTime.Now.AddDays(5); 

      return View(model); 
     } 
     else 
     { 
      return RedirectToAction("LogIn"); 
     } 
    } 

你可以看到這一切在行動上的一個小項目,我有:mydevarmy。我將很快發佈用戶配置文件,您將可以更改顯示名稱(目前會自動生成)。

+0

同意。儘管沒有使用ASP.NET Membership,但您仍然可以使用FormsAuthentication登錄cookie來記住哪個用戶登錄。 – 2011-04-20 13:41:35

+0

@Andrew,來自THE MAN自己!我覺得我正在做的事情正確:))無論如何,感謝給我們DotNetOpenAuth:它使我的生活更容易,作爲回報,我在我去的任何地方實施它! – Kiril 2011-04-20 14:18:51

+0

@Lirik,很酷,這與我所擁有的非常相似,所以我認爲我在正確的軌道上。當我嘗試更新他的個人資料信息時,我有點卡住了,但是如何獲得當前用戶。你用來設置cookie的名字是一個友好的名字,所以不能有多個用戶使用這個友好的名字?或者您是否使用了聲明的ID,如果是,您是否必須使用會話狀態才能使用友好名稱? – 2011-04-20 19:09:33