【发布时间】:2014-04-29 09:21:34
【问题描述】:
我有一个具有 Ownin cookie 身份验证的 Mvc 5 客户端。 我还有一个受 Owin Bearer 令牌保护的 Web Api(我使用了创建令牌端点的 VS2013 Web Api 模板)
好的,现在我的 Mvc 5 客户端需要使用我的 WebApi。 我创建了一个获取不记名令牌的方法:
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... 那么如何保留该令牌(尽管每次请求都会获得一个新令牌)以及如何验证它是否已过期......是否可以以某种方式将其与身份验证 cookie 保存在一起? 处理这种情况的任何最佳实践?
谢谢
【问题讨论】:
-
这里只是一个注释,当您发布到 /token 时,响应包含一个 access_token 可用作 Web API 调用的不记名身份验证,但它也返回一个 set-cookie 标头,该标头会自动在本地保存一个 cookie从 $.ajax 调用,这个 cookie 将授权 MVC 调用。所以对于两个控制器(mvc 和 webapi)来说 1 次登录操作就足够了,我个人将 access_token 保存在 localStorage 中用于 web api 调用;
标签: asp.net-mvc asp.net-web-api owin bearer-token