2017-11-01 1 views
0

現在ログインしているユーザーの役割や電子メールなどの情報が必要ですが、ログに記録されている間、クレームを使用する。だから、基本的には、私がユーザーについて何か必要なときに毎回データベースを検索する必要があります。どのように私はそのようなものを実装することができますか?私はIDをどこかに格納することを考え、それに基づいて情報を調べることを考えましたが、私はいくつかの「よりクーラーな」方法があると考えています。Asp.Net Core 2.0でクレームを使わないでログに記録されたユーザーに関する情報を取得する方法

答えて

1

ページのUserプロパティを使用してください。現在ログインしている人のユーザ名を含む内部プロペラがIdentityです。また、現在ログインしているユーザーのユーザーIDを見つけるのに役立つ拡張メソッドGetUserId()もあります。 ユーザーIDがあれば、データベースを参照してそのユーザーに関する詳細情報を検索できます。

は抽出currecntユーザIDを緩和することができ、次のコードを考えてみましょう:あなたはその情報は後日更新することができる場合でも、ユーザーに関する情報を取得するためにクレームを使用することができます

public static string ValidateAndGetUserId(IIdentity identity) 
{ 
    if (identity == null) 
     throw new ApplicationException("No User is logged in"); 

    var userId = identity.GetUserId(); 

    if (string.IsNullOrWhiteSpace(userId)) 
     throw new ApplicationException("No User is logged in"); 

    return userId; 
} 
+0

ああ、私は知りませんでしたGetUserId()について私はID(私はアイデンティティを使用していない、クッキーのみ)を要求していますが、Idは何も関係なく変更されないので大丈夫です。ありがとうございました。 – Megid

1

あなたが更新した情報を保存した後、再びログインするだけです。&クレームは新しい情報で更新されます。例えば

  1. ユーザーが訪れる "アカウント" ページ。

  2. ユーザーが自分の情報を変更した後、&が保存ボタンをクリックします。

  3. あなたのコントローラでは、ユーザー情報を保存した直後に再度ログインするだけです。ここで

は私が現時点で働いているMVC 5アプリの例ですが、アイデアはまだasp.netコアのために働く必要があります。

// POST: MyAccount 
    [Authorize(Roles = "Admin,Host,User")] 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> MyAccount([Bind(Include = "FirstName,LastName,Email,Phone,Country,State,TimeZone")] MyAccountVM vm) 
    { 

     var id = User.Identity.GetUserId(); 

     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByIdAsync(id); 

      if (user == null) 
      { 
       return HttpNotFound(); 
      } 

      user.FirstName = vm.FirstName; 
      user.LastName = vm.LastName; 
      user.Email = vm.Email; 
      user.UserName = vm.Email; 
      user.Phone = vm.Phone; 
      user.Country = vm.Country; 
      user.State = vm.State; 
      user.TimeZone = vm.TimeZone; 

      var result = await UserManager.UpdateAsync(user); 

      if (result.Succeeded) 
      { 
       var currentUser = await UserManager.FindByIdAsync(user.Id); 

       if (currentUser != null) 
       { 
        await SignInManager.SignInAsync(currentUser, isPersistent: false, rememberBrowser: false); 
       } 

       TempData["saved"] = "true"; 

       return RedirectToAction("MyAccount"); 
      } 
     } 
     return View(); 
    } 
+0

これは実際には本当に面白いです。私はすでに私の仕事を提出しましたが、私はこれを将来に留めておきます。ありがとうございました。 – Megid

関連する問題