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

  • 相关阅读:
    iaas,paas,saas理解
    July 06th. 2018, Week 27th. Friday
    July 05th. 2018, Week 27th. Thursday
    July 04th. 2018, Week 27th. Wednesday
    July 03rd. 2018, Week 27th. Tuesday
    July 02nd. 2018, Week 27th. Monday
    July 01st. 2018, Week 27th. Sunday
    June 30th. 2018, Week 26th. Saturday
    June 29th. 2018, Week 26th. Friday
    June 28th. 2018, Week 26th. Thursday
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4575814.html
Copyright © 2011-2022 走看看