首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MVC认证系统通过令牌认证访问.NET Api

MVC认证系统通过令牌认证访问.NET Api
EN

Stack Overflow用户
提问于 2014-03-22 03:59:08
回答 2查看 15K关注 0票数 17

我有一个具有Ownin cookie身份验证的MVC5客户端。我还有一个受Owin持有者令牌保护的Web (我使用了创建令牌端点的VS2013 Web模板)

好了,现在我的MVC5客户端需要使用我的WebApi了。我创建了一个方法来获取持有者令牌:

代码语言:javascript
复制
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操作中,我称之为:

代码语言:javascript
复制
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保持在一起?有什么最好的实践来处理这种情况吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-03-30 04:33:14

不记名令牌不是授权web应用程序的好方法。如果您将服务的令牌存储在cookie中,那么它将对应用程序的客户端可用,因此服务层将容易受到应用程序的客户端的攻击。唯一解决方案似乎是在会话中保留令牌,但您将失去应用程序的无状态特性。

Here is describied what/how bearer token should be used:“持有者令牌只是一个大的,随机的字符串,客户端必须在每次API调用中呈现。持有者令牌很简单,因为两端都不需要特殊的签名或验证码。客户端负责将令牌存储在安全的地方,并在每次请求时发送它。服务器负责在数据库中查找令牌,并确保它是有效的--就这样。”

这是在single page application中使用持有者令牌的一个很好的例子,其中客户端直接与服务对话。

无论如何,我建议你使用HMAC authentication、BCrypt或ClientCertificates。甚至amazon也使用它来验证REST请求。

票数 4
EN

Stack Overflow用户

发布于 2014-03-27 01:55:10

如果要跨所有操作管理令牌,则应更改代码以使用自定义授权筛选器。该过滤器可以添加到所有Web API请求、控制器的所有操作或单个操作。为此,从AuthorizeAttribute派生并从筛选器发出GetBearerToken调用。将令牌放入HTTP上下文中,以便在请求处理期间使用。您可以使用工厂来生成HttpClient实例并添加适当的令牌进行身份验证,而不是直接调用创建for实例。

至于确定令牌是否过期,您可以添加一个额外的筛选器来检查返回的特定错误,或者在授权筛选器中执行检查。我不知道你的所有需求,所以很难确定合适的解决方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22568409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档