我有一个Mvc 5客户端拥有自己的cookie认证。
我还有一个受到Owin承载令牌保护的Web Api(我使用了创建令牌端点的VS2013 Web Api模板)
我还有一个受到Owin承载令牌保护的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在一起吗?
处理这种情况的最好的方法?
谢谢
解决方法
如果我正确的话,您的MVC 5客户端应用程序正在访问不同应用程序的WebAPI。
MVC 5客户端使用cookie来验证用户。要访问WebAPI,您可以从/ Token端点获取承载信号,并将其发送到授权标头。
MVC 5客户端使用cookie来验证用户。要访问WebAPI,您可以从/ Token端点获取承载信号,并将其发送到授权标头。
您不要从客户端Javascript代码调用WebAPI,您只需要在MVC操作的MVC操作运行MVC5应用程序的服务器上调用它。
在每个服务调用声音错误之前获取一个新的令牌。这意味着每次两次往返。这不能执行。
如果我是对的,你可以:
>将令牌存储在Session对象中。只要您的MVC应用程序的用户进行身份验证,并且他的会话仍然存在,那么您将始终拥有相同的令牌。
如果它已过期,您可以从WebAPI获得401未经授权的访问。
要保持您的MVC动作单元可测试,您可以将会话访问包装到您注入到Action(依赖注入)中的服务中。
>您可以将令牌存储在类似于已存在的Authentication Cookie的cookie中。这样您就不需要在服务器端进行会话。再次,我将包含访问权限,从Cookie中获取所有操作使用的服务中的令牌。
我将使用会话存储。简单。直向前
但也许我错过了一些东西
希望这可以帮助你。反馈赞赏:-)