加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用令牌认证访问Web Api的MVC .NET cookie认证

发布时间:2020-12-16 00:27:28 所属栏目:asp.Net 来源:网络整理
导读:我有一个Mvc 5客户端拥有自己的cookie认证。 我还有一个受到Owin承载令牌保护的Web Api(我使用了创建令牌端点的VS2013 Web Api模板) 好的,现在我的Mvc 5客户端需要使用我的WebApi。 我创建了一个获取承载令牌的方法: internal async Taskstring GetBearerT
我有一个Mvc 5客户端拥有自己的cookie认证。
我还有一个受到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端点获取承载信号,并将其发送到授权标头。

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

在每个服务调用声音错误之前获取一个新的令牌。这意味着每次两次往返。这不能执行。

如果我是对的,你可以:

>将令牌存储在Session对象中。只要您的MVC应用程序的用户进行身份验证,并且他的会话仍然存在,那么您将始终拥有相同的令牌。
如果它已过期,您可以从WebAPI获得401未经授权的访问。
要保持您的MVC动作单元可测试,您可以将会话访问包装到您注入到Action(依赖注入)中的服务中。
>您可以将令牌存储在类似于已存在的Authentication Cookie的cookie中。这样您就不需要在服务器端进行会话。再次,我将包含访问权限,从Cookie中获取所有操作使用的服务中的令牌。

我将使用会话存储。简单。直向前
但也许我错过了一些东西

希望这可以帮助你。反馈赞赏:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读