2017-07-03 25 views
0

ASP.NET Identity 2 or 3では、クラスレベルでユーザー情報を取得できますか?シナリオは次のとおりです。アプリには2つのロール(AdminRoleRegRole)しかありません。 AdminRoleのユーザーは、AdminRoleユーザーのみが使用できるドロップダウンからユーザー名を選択することにより、UserRoleのユーザーとして機能することができます。私がする必要があるのは、管理者がホームページからのドロップダウンからユーザーを選択した場合、選択したユーザーの名前をクラス(コントローラー)レベルの変数に割り当てて、ユーザー名をすべてそのコントローラー(クラス)のアクションメソッド。私は、次のことを試してみましたが、それは以下のコードのif (User.Identity.Name == "Admin")ラインでNullExceptionをスロー:ASP.NETでのクラスレベルのユーザー情報の取得ID

public class HomeController : Controller 
{ 
    ... 
    [HttpPost] 
    public IActionResult ChooseUser(string selectedUser) 
    { 
     HttpContext.Session.SetString(SessionKeySelUser, selectedUser); 

     return View(); 
    } 
} 

他のコントローラ [管理者は、ドロップダウンからユーザー名を選択]

NullReferenceException: Object reference not set to an instance of an object.

ホームコントローラ [上の選択されたユーザー名をコントローラのすべての操作方法で使用したい場所]

public class TestController : Controller 
{ 
    private MyProjContext _context; 
    private string _userName; 

    public TestController (MyProjContext context) 
    { 
    _context = context; 

    if (User.Identity.Name == "Admin") 
     _userName = HttpContext.Session.GetString("selectedUser"); //This session variable was assigned the user name value when the admin had selected the user name from the dropdown on the home page 
    } 
} 

//use the class level variable _userName in all action methods like the one below 
public IActionResult TestAction() 
{ 
    _context.Orders.Where(ord => ord.Seller == _userName); 

    return View(); 
} 

.... 

答えて

0

Identity 3を使用している場合、現在ログインしているユーザーを取得するには、UserManagerのインスタンスを取得する必要があります。

のインスタンスはiOCを使用して取得し、次にメソッドをUserManagerとすると、現在のユーザーオブジェクトモデルを取得できます。

protected readonly UserManager<AppUser> UserManager; 
private Task<AppUser> GetCurrentUserAsync() => UserManager.GetUserAsync(HttpContext.User); 

public TestController(UserManager<AppUser> userManager) 
{ 
    UserManager = userManager; 
} 

あなたの条件には、このように変更することができます:あなたは、コンストラクタからアクセスしようとしているので、あなたはそれを同期させるために前にResultを追加することができます

var curUser = await GetCurrentUserAsync(); 
if (curUser.Name == "Admin") 
     _userName = HttpContext.Session.GetString("selectedUser"); //This session variable was assigned the user name value when the admin had selected the user name from the dropdown on the home page 

。あなたがコメントで報告したように、クラスが構築されているとき、コントローラのHttpContextはnullです。それにもかかわらず、IHttpContextAccessorからアクセスできます。

public TestController(UserManager<AppUser> userManager, IHttpContextAccessor httpContextAccessor) 
{ 
    UserManager = userManager; 
    var curUser = UserManager.GetUserAsync(httpContextAccessor.HttpContext.User).Result; 
    if (curUser.Name == "Admin") 
     _userName = HttpContext.Session.GetString("selectedUser"); 
} 

あなたがIdentityを使用している場合、私はIHttpContextAccessorがパイプラインに注入されると信じています。 nullを返す場合は、Startupクラスのシングルトンとして追加する必要があります。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
+0

あなたは 'Task 'を意味する 'Task 'と仮定します。とにかく、 'GetCurrentUserAsync.Name ==" Admin "'私はエラーが発生しています:** Task 'はName **の定義を含んでいません。 – nam

+0

あなたはそうです。私はちょうど答えを更新しました。私はカスタムユーザーを使用します。そのため、AppUserクラスに名前を付けました。デフォルトはApplicationUserです。 –

+0

はい、同じエラーが発生します。 – nam

関連する問題