c# userstore 如何獲取當前用戶以及如何在MVC5中使用User類?




mvc version (4)

  • 我如何獲得MVC 5中當前登錄用戶的ID? 我嘗試了StackOverflow建議,但它們似乎不適用於MVC 5。
  • 另外,MVC 5為用戶分配內容的最佳做法是什麼? (例如, User應該有Items我是否應該將用戶的Id存儲在Item ?是否可以使用List<Item>導航屬性擴展User類別?

我正在使用MVC模板中的“個人用戶帳戶”。

試過這些:

'Membership.GetUser()'為null。


獲取ID非常簡單,你已經解決了這個問題。

你的第二個問題雖然涉及更多一點。

所以,現在這些都是預發布的東西,但是您面臨的常見問題是您在何處使用新屬性(或者您所遇到的Items集合)擴展用戶。

開箱後,您將在Models文件夾下(在編寫本文時)獲得一個名為IdentityModel的文件。 在那裡你有幾個班; ApplicationUserApplicationDbContext 。 要添加您的Items集合,您需要修改ApplicationUser類,就像您使用Entity Framework的普通類一樣。 事實上,如果你仔細研究一下,你會發現所有與身份有關的類(用戶,角色等)都只是POCO,並且具有適當的數據註釋,所以它們可以和EF6一起使用。

接下來,您需要對AccountController構造函數進行一些更改,以便它知道使用您的DbContext。

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

現在為你登錄的用戶獲取整個用戶對像有點深奧,說實話。

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

該行將完成工作,您將可以像訪問那樣訪問userWithItems.Items

HTH


如果您在ASP.NET MVC控制器中編碼,請使用

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

值得一提的是, User.Identity.IsAuthenticatedUser.Identity.Name將在不添加上述using語句的情況下工作。 但是沒有它, GetUserId()將不會出現。

如果您在控制器以外的課程中,請使用

HttpContext.Current.User.Identity.GetUserId();

在MVC 5的默認模板中,用戶ID是一個存儲為字符串的GUID。

還沒有最佳做法,但發現了一些有關擴展用戶配置文件的有價值信息:


我感到你的痛苦,我試圖做同樣的事情。 在我的情況下,我只想清除用戶。

我創建了一個所有控制器繼承自的基類控制器類。 在其中我重寫OnAuthentication並將OnAuthentication設置filterContext.HttpContext.User to null

這是我成功做到的最好的...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}

試試像這樣:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

適用於RTM。





asp.net-identity