簡體   English   中英

在Web API控制器中獲取當前登錄的用戶

[英]Getting current logged on user in web api controller

我試圖在Web API控制器中檢索當前登錄的用戶詳細信息,以創建用戶個人資料頁面。

我已經創建了方法,但是用戶在代碼中始終返回null,如下所示。 這在我的MVC控制器中可以正常工作,但在Web API控制器中會引發錯誤。

[HttpGet]
public IActionResult userProfile()
{
    if (ModelState.IsValid)
    {
        var user = _userManager.Users.First(x => x.Email == User.Identity.Name);
        return Ok(new UserViewModel
        {
            Id = user.Id,
            UserName = user.Email,
            FirstName = user.FirstName,
            LastName = user.LastName
        });
    }
    else
    {
        return BadRequest(ModelState);
    }
}

更新

[HttpGet]
[Authorize(Roles = "Client, Administrator")]
public IActionResult userProfile()
{

    string baseUrl = "https://localhost:5001";
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(baseUrl);
    var contentType = new MediaTypeWithQualityHeaderValue("application/json");
    client.DefaultRequestHeaders.Accept.Add(contentType);
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", HttpContext.Session.GetString("token"));

    UserViewModel userModel = new UserViewModel();
    HttpResponseMessage response = client.GetAsync("https://localhost:5001/api/UserAPI").Result;
    string stringData = response.Content.ReadAsStringAsync().Result;
    userModel = JsonConvert.DeserializeObject<UserViewModel>(stringData);

    return View(userModel);
}

錯誤信息:

System.InvalidOperationException:'序列不包含任何元素

我假設您正在使用WebAPI 2。

請嘗試以下操作:

var user = _userManager.GetUser(HttpContext.User);

要么

var user = _userManager.FindById(User.Identity.GetUserId());

代替.First()將其更改為.FirstOrDefault()

API是無狀態的,這意味着沒有登錄用戶或會話的概念。 這是因為每個請求都是唯一的,獨立的,並且包含提供響應所需的所有信息。

API無法知道誰在發送請求,可能有1萬個人同時發送請求,那么到底誰在“登錄”呢?

因此,如果要加載用戶配置文件,則將userID作為參數發送,如下所示:

    [HttpGet]

    public IActionResult userProfile(string userEmail)
    {
         if ( !string.IsNullOrEmpty (userEmail) ) ..... etc etc
         {
            var user = _userManager.Users.First(x => x.Email == userEmail);
            return Ok(new UserViewModel
            {
                Id = user.Id,
                UserName = user.Email,
                FirstName = user.FirstName,
                LastName = user.LastName
            });   
        }
    }

附帶說明一下,如果您沒有任何輸入參數,或者輸入是原始類型(例如string或int),則ModelState.IsValid將不執行任何操作。 僅當您使用正確的規則填充模型類時,才使用ModelState.IsValid。

就我而言,我實際上可以將字符串替換為一個類

public class UserProfileRetrieveModel
{
      [Required]
      public string UserEmail { get;set; }
}

然后我可以做:

[HttpGet]
    public IActionResult userProfile(UserProfileRetrieveModel model)
    {
        if (ModelState.IsValid)
        {
            var user = _userManager.Users.First(x => x.Email == model.UserEmail);
            //etc
        }
        else
        {

            return BadRequest(ModelState);

        }
    }

---問題更新后

因此看起來您有一個客戶端應用程序,並從中調用API。 我上面說的所有內容仍然適用,只需在調用API之前填充您的數據即可。

例:

public IActionResult userProfile()
{
//removed code we don't care about

   string userEmail = "";// get your user email here in the MVC controller
   //populate it in the api url.
   //you might need to URL encode it since it will contain dots and @

   string apiUrl = "https://localhost:5001/api/UserAPI/{userEmail}";
   HttpResponseMessage response = client.GetAsync(apiUrl).Result;        
}

您無需在API中進行任何操作,只需將所需的所有內容從MVC控制器傳遞給API。

現在,除了所有這些,您還有大量的異步問題。 該部分需要工作,盡管與問題無關。

從錯誤消息中看來,您正在嘗試從空序列中檢索元素。 因此,請檢查您是否有數據,並嘗試使用.FirstOrDefault()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM