public class OAuthClientTest
{
private HttpClient _httpClient; public OAuthClientTest()
{
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri("http://openapi.cnblogs.com");
} [Fact]
public async Task Get_Accesss_Token_By_Resource_Owner_Password_Credentials_Grant()
{
Console.WriteLine(await GetAccessToken());
} private async Task<string> GetAccessToken()
{
var clientId = "";
var clientSecret = ""; var parameters = new Dictionary<string, string>();
parameters.Add("grant_type", "password");
parameters.Add("username", "博客园团队");
parameters.Add("password", "cnblogs.com"); _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret))
); var response = await _httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters));
var responseValue = await response.Content.ReadAsStringAsync();
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
return JObject.Parse(responseValue)["access_token"].Value<string>();
}
else
{
Console.WriteLine(responseValue);
return string.Empty;
}
} [Fact]
public async Task Call_WebAPI_By_Resource_Owner_Password_Credentials_Grant()
{
var token = await GetAccessToken();
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
Console.WriteLine(await (await _httpClient.GetAsync("/api/users/current")).Content.ReadAsStringAsync());
} }

1)是的,获取access token的URL就是由TokenEndpointPath决定的。

2)获取access token与Web API没有关系,Web API对应于OAuth中的Resource Server,而获取access token访问的是OAuth中的Authorization Server(CNBlogsAuthorizationServerProvider)。Resource Server(Web API+ Authorize)验证客户端完全是根据access token。

3)是的,在access token的生命周期内,不需要再请求Authorization Server获取token。token不是通过GrantResourceOwnerCredentials生成的。

4)如果不需要设置AuthenticationTicket的属性,当然可以改为context.Validated(oAuthIdentity),这个方法就只是帮你new一下AuthenticationTicket。

5)从测试情况看,去掉await base.GrantResourceOwnerCredentials(context);没影响,但由于不知道基类的这个方法中究竟干了啥,保险起见,就没去掉。

6)ValidateClientAuthentication验证的是客户端(Client),基于client_id与client_secret;GrantResourceOwnerCredentials验证的是用户(ResourceOwner),基于username与password。不能去掉。

在Web API中验证的只是Access Token。
以Resource Owner Password Credentials Grant的方式(grant_type=password)获取的Access Token,不管是受保护的还是与用户相关的API,都可以使用。
以Client Credentials Grant的方式(grant_type= client_credentials)获取的Access Token,只能用于受保护但与用户无关的API。
对于客户端来说,只需持有1个Acess Token即可。

1、OWIN OAuth中的access token是self-contained token,用户标识就存储在access token中,服务端不需要存储,只需解密。这与cookie类似。
2、api通常都用https,如果你对安全性要求高,那就对client_secret进行加密。


参考

在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token

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

ASP.NET Web API与Owin OAuth:调用与用户相关的Web API

postman中如何使用OAuth

Call a Web API From a .NET Client (C#)

OAuth客户端调用的更多相关文章

  1. 客户端调用 WCF 的几种方式

    转载网络代码.版权归原作者所有..... 客户端调用WCF的几种常用的方式: 1普通调用 var factory = new DataContent.ServiceReference1.Custome ...

  2. webservice发布服务:AXIS2及客户端调用

    1.Axis2: 到官网下载axis2的压缩包. 解压后: 1.将lib文件下的jar包复制到项目中 2.在web-inf下创建services->META-INF->services.x ...

  3. CXF发布webService服务以及客户端调用

    这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...

  4. Dynamics AX 2012 R2 堆栈跟踪:不能对客户端调用'unchecked'

    有一个Custom Service一直在正常使用.今天,Reinhard尝试在JOB中以X++代码Debug Custom Service的Method时,收到以下错误提示: 'unchecked' ...

  5. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  6. HTTP请求中的Body构建——.NET客户端调用JAVA服务进行文件上传

    PS:今日的第二篇,当日事还要当日毕:)   http的POST请求发送的内容在Body中,因此有时候会有我们自己构建body的情况. JAVA使用http—post上传file时,spring框架中 ...

  7. Java与WCF交互(一):Java客户端调用WCF服务

    最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...

  8. jdk的wsimport方法实现webservice客户端调用服务

    1.配置好jdk环境,打开命令行,输入wsimport回车能看到很多该命令的参数, -s:要生成客户端代码的存储路径 -p:对生成的代码从新打包 这两个最常用. 在打开的命令行中输入:wsimport ...

  9. 用JDK自带的工具生成客户端调用Webservice的代码

    JAVA下客户端调用Webservice代码简直是让人心生畏惧,今日尝试,做记录如下,参考网上的众多解决方案,下面这种方式是比较简单的. 在jdk的bin目录下有一个wsimport.exe的工具,使 ...

随机推荐

  1. 自己开发Thinkpad电源管理程序

    自己开发Thinkpad电源管理程序 - 知乎 https://zhuanlan.zhihu.com/p/20706403

  2. SpringBoot 之数据访问

    1. Spring Boot 与 JDBC 默认使用 org.apache.tomcat.jdbc.pool.DataSource 数据源; // application.yml spring: da ...

  3. git远程库与本地联系报错:fatal: Not a git repository (or any of the parent directories): .git

    在github上新建了一个仓库,然后相与本地的仓库联系起来 $ git remote add origin https://github.com/lizhong24/mysite2.git fatal ...

  4. CF #301 A :Combination Lock(简单循环)

    A :Combination Lock 题意就是有一个密码箱,密码是n位数,现在有一个当前箱子上显示密码A和正确密码B,求有A到B一共至少需要滚动几次: 简单循环:

  5. PHP error_log 新认知

    //error_log 简介及使用方法 //  error_log("消息","类型","路径"); //message   //type  ...

  6. LINux网络的NAPI机制详解一

    在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! ht ...

  7. spring 启动过程

    首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境: 其次,在web.xm ...

  8. django之自定义软删除Model

    软删除 简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录.这样做的好处是可以统计数据,可以进行恢复操作等等. 预备知识 Managers Managers 是djang ...

  9. jQuery实现复选框 全选、反选、全不选

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  10. pycharm激活(转)

    1.注册码激活Activation code http://idea.lanyus.com/ 2.服务器激活License server(推荐) 或者http://182.254.242.193:10 ...