Asp.net

Web API 中的 ASP.NET 標識

  • June 21, 2020

我正在開發一個使用新的 ASP.NET Identity 進行身份驗證的簡單應用程序。由於我計劃將來有一個移動應用程序,因此我將身份驗證放在了 Web API 中,我從 Razor 網頁(沒有 MVC 或表單)從 jQuery 發佈到該 API。到目前為止,post 工作正常並創建使用者並將他們登錄 - 在 API 端。

但是,我無法確定如何從那裡開始。我需要設置 IsAuthenticated 以便我可以提供正確的頁面,但它總是返回 false。由於 Identity 非常新,因此幾乎沒有可用的文件,而且我無法找到任何像從 Web API 執行它那樣複雜的東西。

問:登錄後從 Web API 中的身份驗證返回以正確User.Identity.IsAuthenticated設置的正確方法是什麼?

登錄.cshtml

@if (User.Identity.IsAuthenticated)
{
   @RenderPage("/userpage.cshtml");
}

else
{
   <form id="loginForm">
       <b>Login</b>
       <input type="email" placeholder="Email" name="email" id="loginEmail" />
       <input type="password" placeholder="Password" name="password" id="loginPassword" />
       <input type="submit" value="Log In"/>
   </form>
}

<script>
   $("#loginForm").submit(function(event)
   {
       event.preventDefault();
       $.post("/api/login/",
       {
           Username: $('#loginEmail').val(),
           Password: $('#loginPassword').val()
       }, function () 
          { 
              //???
          }, "json");

       return false;
   });
</script>

登錄 Web API

public class LoginController : ApiController
{
   public async void Post(UserInfo info)
   {
       var manager = new AuthenticationIdentityManager(new IdentityStore());
       var result = await manager.Authentication.CheckPasswordAndSignInAsync(HttpContext.Current.GetOwinContext().Authentication, info.Username, info.Password, true);

       if (result.Success)
       {
           //???
       }
   }
}

這取決於您使用的身份驗證方法。大多數 Web 應用程序使用表單 (Cookie) 身份驗證模組作為主要的身份驗證方法。它應該適用於您的網頁,但如果您想在本機客戶端(如移動應用程序)上使用您的 API,它不是最佳選擇。使用 web api 啟用 cookie 身份驗證時,您應該小心 CSRF 攻擊。

假設您使用 cookie 身份驗證,您仍然有兩個選擇。一個是 FormsAuthentication IIS 模組,它比較老,你應該使用FormsAuthentication.SetAuthCookie來登錄使用者。

另一種方式是OWIN cookie 中間件,它在預設的 MVC 5 模板中用於支持身份驗證。請查看關於如何通過 OWIN API 登錄使用者的答案

如果您想通過移動應用程序為 Web API 提供更好的身份驗證故事,我建議您使用OWIN OAuth 中間件啟用不記名令牌作為 Web API 的主要身份驗證方法。在 MVC 5 SPA 模板中,它展示了將它們與 MVC 和 cookie auth 一起使用的良好模式。我的部落格了解 VS2013 RC 的 SPA 模板中的安全功能應該可以大致了解它們如何協同工作。

身份框架有一個OWIN 包,它實現了大部分 OWIN 身份驗證程式碼。所以你不需要實現你自己的。為什麼不使用它?

引用自:https://stackoverflow.com/questions/19326064