asp.net-mvc - MVC .NET cookie 身份验证系统通过 token 身份验证访问 Web Api

标签 asp.net-mvc asp.net-web-api owin bearer-token

我有一个 Mvc 5 客户端,它具有 Ownin cookie 身份验证。 我还有一个受 Owin Bearer token 保护的 Web Api(我使用了 VS2013 Web Api 模板,用于创建 token 端点)

好的,现在我的 Mvc 5 客户端需要使用我的 WebApi。 我创建了一个获取不记名 token 的方法:

internal async Task<string> GetBearerToken(string siteUrl, string Username, string Password)
{
     HttpClient client = new HttpClient();

     client.BaseAddress = new Uri(siteUrl);
     client.DefaultRequestHeaders.Accept.Clear();

     HttpContent requestContent = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded");

     HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent);

     if (responseMessage.IsSuccessStatusCode)
     {
         TokenResponseModel response = await responseMessage.Content.ReadAsAsync<TokenResponseModel>();
         return response.AccessToken;
     }

     return "";
}

在我的 Mvc 操作中我称之为:

public async Task<ActionResult> Index()
{
     var token = await GetBearerToken("http://localhost:6144/", "teste", "123456");

     using (var client = new HttpClient())
     {
         client.DefaultRequestHeaders.Add("Authorization", "Bearer "+ token);

         var response = await client.GetAsync("http://localhost:6144/api/values");

         if (response.IsSuccessStatusCode)
         {
             var data = response.Content.ReadAsAsync<IEnumerable<string>>();

             return Json(data.Result, JsonRequestBehavior.AllowGet);
         }
     }   
}

一切正常...但我需要在所有操作中使用 Web Api... 那么我如何保留该 token (尽管每次请求都会获取一个新 token )以及如何验证它是否过期......是否可以以某种方式将其与身份验证 cookie 保留在一起? 处理这种情况有什么最佳实践吗?

谢谢

最佳答案

如果我猜对了,您的 MVC 5 客户端应用程序正在访问另一个应用程序的 WebAPI。 MVC 5 客户端使用 cookie 来验证用户身份。要访问 WebAPI,您可以从/Token 端点获取 Bearer token 并将其在 Authorization header 中发送。

您不需要从客户端 Javascript 代码调用 WebAPI,只需从 MVC5 应用程序服务器上运行的 MVC 操作中调用它。

在每次服务调用之前获取新的 token 听起来是错误的。这意味着每次需要 2 次往返。这不可能是高性能的。

如果我没猜错的话,你可以:

  1. 将 token 存储在 Session 对象中。只要您的 MVC 应用程序的用户经过身份验证并且他的 session 处于事件状态,您就将始终拥有相同的 token 。 如果过期,您将从 WebAPI 返回 401 未经授权的访问。 为了保持 MVC 操作单元可测试,您可以将 session 访问包装到注入(inject)操作(依赖注入(inject))的服务中。

  2. 您可以将 token 存储在类似于现有身份验证 cookie 的 cookie 中。这样您就不需要服务器端的 session 。在这里,我再次将从 Cookie 获取 token 的访问权限包装在您的所有操作都使用的服务中。

我会使用 session 存储。简单的。直线前进。 但也许我错过了一些东西

希望这对您有帮助。 感谢反馈:-)

关于asp.net-mvc - MVC .NET cookie 身份验证系统通过 token 身份验证访问 Web Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22568409/

相关文章:

c# - 为什么我收到 "Value does not fall within the expected range"?

asp.net-web-api - 更改密码后如何使OAuth token 无效?

c# - 分支执行后如何返回管道根?

asp.net-mvc - 如何使用 ASP.Net MVC5 和 OWIN 返回 StatusCode 401

c# - ASP.NET WebAPI Selfhost 没有解析到 Controller 的路由

asp.net-mvc - MVC 5 外部身份验证,身份验证模式=表单

c# - HttpClient.GetStreamAsync 卡住

c# - 如何首先在代码中创建函数?

javascript - 使用 ajax MVC 传递复杂对象

c# - 使用 ApplicationUser 插入依赖实体