我有一个 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 次往返。这不可能是高性能的。
如果我没猜错的话,你可以:
将 token 存储在 Session 对象中。只要您的 MVC 应用程序的用户经过身份验证并且他的 session 处于事件状态,您就将始终拥有相同的 token 。 如果过期,您将从 WebAPI 返回 401 未经授权的访问。 为了保持 MVC 操作单元可测试,您可以将 session 访问包装到注入(inject)操作(依赖注入(inject))的服务中。
您可以将 token 存储在类似于现有身份验证 cookie 的 cookie 中。这样您就不需要服务器端的 session 。在这里,我再次将从 Cookie 获取 token 的访问权限包装在您的所有操作都使用的服务中。
我会使用 session 存储。简单的。直线前进。 但也许我错过了一些东西
希望这对您有帮助。 感谢反馈:-)
关于asp.net-mvc - MVC .NET cookie 身份验证系统通过 token 身份验证访问 Web Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22568409/