博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API
阅读量:5861 次
发布时间:2019-06-19

本文共 2388 字,大约阅读时间需要 7 分钟。

在前一篇中,我们使用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
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
GetAccessToken() { var parameters = new Dictionary
(); 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
(); } }

运行结果如下:

["value1","value2"]

搞定!

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

转载地址:http://ezrjx.baihongyu.com/

你可能感兴趣的文章
Linux命令操作大全
查看>>
从周五开始香港主机特别慢,香港主机用户有同感吗?
查看>>
Ember.js 3.9.0-beta.3 发布,JavaScript Web 应用开发框架
查看>>
python标准库00 学习准备
查看>>
4.2. PHP crypt()
查看>>
commonservice-config配置服务搭建
查看>>
连接池的意义及阿里Druid
查看>>
Python递归函数与匿名函数
查看>>
loadrunner安装运行一步一步来(多图)
查看>>
监控工具htop的安装及使用
查看>>
Nodejs使用图灵机器人获取笑话
查看>>
Spring 任务调度 简单的,使用Schedule
查看>>
SQL 2005删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)的解决...
查看>>
【Touch&input 】支持多个游戏控制器(18)
查看>>
SQL语句学习
查看>>
进老男孩的自我介绍和决心书
查看>>
线上Linux服务器运维安全策略经验分享
查看>>
Android一些问题的解决方案
查看>>
Luogu P4707 重返现世
查看>>
目标与绩效管理实战专家胡立
查看>>