zoukankan      html  css  js  c++  java
  • Access Toke调用受保护的API

    ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization Server的一个实现)成功发放了Access Token,并在客户端成功拿到了Access Token。

    那Access Token有什么用呢?在OAuth中对Resource Server(比如Web API)访问权限的验证都是基于Access Token。不管是什么样的客户端来调用,Resource Server总是铁面无私,只认Access Token。

    在ASP.NET Web API中启用OAuth的Access Token验证非常简单,只需在相应的Controller或Action加上[Authorize]标记,比如:

    复制代码
    [Authorize]
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
    复制代码

    加上[Authorize]之后,如果不使用Access Token,调用API时就会出现如下的错误:

    {"Message":"Authorization has been denied for this request."}

    这时你也许会问,为什么一加上[Authorize]就会有这个效果?原来的Forms验证怎么不起作用了?

    原因是你在用Visual Studio创建ASP.NET Web API项目时,VS自动帮你添加了相应的代码,打开WebApiConfig.cs,你会看到下面这2行代码:

    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

    就是这2行代码,改变了[Authorize]的作用。

    在ASP.NET Web API中启用OAuth验证就这么简单(简单的背后是微软实现了基于OWIN的OAuth,实现源代码在Katana项目中)。

    那在客户端如何使用Access Token调用Web API呢?

    也很简单,只要在http请求头中加上Bearer:Token即可,客户端调用示例代码如下:

    复制代码
        public class OAuthClientTest
        {
            private HttpClient _httpClient;
    
            public OAuthClientTest()
            {
                _httpClient = new HttpClient();
                _httpClient.BaseAddress = new Uri("http://openapi.cnblogs.com");
            }
    
            [Fact]
            public async Task Call_WebAPI_By_Access_Token()
            {
                var token = await GetAccessToken();
                _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                Console.WriteLine(await (await _httpClient.GetAsync("/api/values")).Content.ReadAsStringAsync());
            }
    
            private async Task<string> GetAccessToken()
            {
                var parameters = new Dictionary<string, string>();
                parameters.Add("client_id", "1234");
                parameters.Add("client_secret", "5678");
                parameters.Add("grant_type", "client_credentials");
    
                var response = await _httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters));
                var responseValue = await response.Content.ReadAsStringAsync();                
    
                return JObject.Parse(responseValue)["access_token"].Value<string>();
            }
        }
    复制代码

    运行结果如下:

    ["value1","value2"]

    搞定!

    ASP.NET Web API与基于Owin实现的OAuth的整合,让原本复杂的问题变得简单。

     

     

     

     
    标签: OAuthWebAPI

  • 相关阅读:
    小棒组合项目总结
    小棒组合团队项目第十五周总结
    小棒组合第十四周项目总结
    小棒组合第三周项目总结
    小棒组合第十二周项目总结
    小棒组合团队项目简介
    读 漏屋的<找对英语学习方法的第一本书>
    关于网上商城开发的随笔记录4
    关于网上商城开发的随笔记录3
    关于MVC的开源商城 Nop之闲聊
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4575814.html
Copyright © 2011-2022 走看看