OAuth真是一个复杂的东东,即使你把OAuth规范倒背如流,在具体实现时也会无从下手。因此,Microsoft.Owin.Security.OAuth应运而生(它的实现代码在Katana项目中),帮助开发者偷了不少工,减了不少料。

这篇博文试图通过一个简单的示例分享一下如何基于Microsoft.Owin.Security.OAuth,使用Client Credentials Grant授权方式给客户端发放access token。

Client Credentials Grant的授权方式就是只验证客户端(Client),不验证用户(Resource Owner),只要客户端通过验证就发access token。举一个对应的应用场景例子,比如我们想提供一个“获取网站首页最新博文列表”的WebAPI给iOS App调用。由于这个数据与用户无关,所以不涉及用户登录与授权,不需要Resource Owner的参与。但我们不想任何人都可以调用这个WebAPI,所以要对客户端进行验证,而使用OAuth中的 Client Credentials Grant 授权方式可以很好地解决这个问题。

具体实现方式如下:

1)用Visual Studio 2013/2015创建一个Web API项目,VS会生成一堆OAuth相关代码。

2)打开Startup.Auth.cs ,精简一下代码,我们只需要实现以Client Credentials Grant授权方式拿到token,其它无关代码全部清除,最终剩下如下代码:

public partial class Startup
{public void ConfigureAuth(IAppBuilder app){var OAuthOptions = new OAuthAuthorizationServerOptions{TokenEndpointPath = new PathString("/token"),Provider = new CNBlogsAuthorizationServerProvider(),AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),AllowInsecureHttp = true};app.UseOAuthBearerTokens(OAuthOptions);}
}

3)创建一个新的类 CNBlogsAuthorizationServerProvider,并继承自 OAuthAuthorizationServerProvider,重载 OAuthAuthorizationServerProvider() 与 GrantClientCredentials() 这两个方法。代码如下:

public class CNBlogsAuthorizationServerProvider : OAuthAuthorizationServerProvider
{public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context){string clientId;string clientSecret;context.TryGetFormCredentials(out clientId, out clientSecret);if (clientId == "1234" && clientSecret == "5678"){context.Validated(clientId);}return base.ValidateClientAuthentication(context);}public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context){var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, "iOS App"));var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());context.Validated(ticket);return base.GrantClientCredentials(context);}
}

在 ValidateClientAuthentication() 方法中获取客户端的 client_id 与 client_secret 进行验证。

在 GrantClientCredentials() 方法中对客户端进行授权,授了权就能发 access token 。

这样,OAuth的服务端代码就完成了。这么简单?是的,就这么简单,因为有了Microsoft.Owin.Security.OAuth。

4)然后写客户端调用代码测试一下:

public class OAuthClientTest
{private HttpClient _httpClient;public OAuthClientTest(){_httpClient = new HttpClient();_httpClient.BaseAddress = new Uri("http://openapi.cnblogs.com");}[Fact]public void Get_Accesss_Token_By_Client_Credentials_Grant(){var parameters = new Dictionary<string, string>();parameters.Add("client_id", "1234");parameters.Add("client_secret", "5678");parameters.Add("grant_type", "client_credentials");Console.WriteLine(_httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters)).Result.Content.ReadAsStringAsync().Result);}
}

运行结果如下:

{"access_token":"8PqaWilv_SJT7vRXambP7Mebyaf3KO1GXYHsqA-oPMOQF6xk1YpluczOZGo-WwATU5YmGb0wSR0cUQMC8RSZfwO8nwom7yG11FIANhy2PNiqTg2CYdJF0sf0ggFs6it_i3mc_m1iEFCK2dLBPDJXPI24wngCPR0wP_zugZvyKv314BM0PQmnnwg3kLXR1DISKRbs5-i59VCtFSZgkM7A0w","token_type":"bearer","expires_in":1209599}

搞定!

【更新】

建议使用Basic Authentication传递clientId与clientSecret,服务端CNBlogsAuthorizationServerProvider中的TryGetFormCredentials()改为TryGetBasicCredentials(),客户端的调用代码如下:

public class OAuthClientTest
{private HttpClient _httpClient;public OAuthClientTest(){_httpClient = new HttpClient();_httpClient.BaseAddress = new Uri("http://openapi.cnblogs.com");}[Fact]public void Get_Accesss_Token_By_Client_Credentials_Grant(){var clientId =  "1234";var clientSecret = "5678";        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret)));var parameters = new Dictionary<string, string>();        parameters.Add("grant_type", "client_credentials");       Console.WriteLine(_httpClient.PostAsync("/token", new FormUrlEncodedContent(parameters)).Result.Content.ReadAsStringAsync().Result);}
}

【参考资料】

ASP.Net MVC: Creating an OAuth client credentials grant type token endpoint

转载于:https://www.cnblogs.com/dudu/p/4569857.html

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

  1. 利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

    微软动态CRM专家罗勇 ,回复337或者20190521可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 配置Dynamics 365 & PowerApps 支 ...

  2. Asp.net中基于Forms验证的角色验证授权[转]

    Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...

  3. 【转载】Asp.Net中基于Forms验证的角色验证授权

    Asp.Net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...

  4. Asp.net中基于Forms验证的角色验证授权

    Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...

  5. ASP.NET中基于ExtJS的控件Ext.net的使用

    ExtNet是国外一家公司开发的基于ExtJS的ASP.NET控件库. 1.新建项目Layout_Anchor 2.引用Ext.Net.dll 3.在Web.config文件中的web节点加入 < ...

  6. 收藏:Asp.net中基于Forms验证的角色验证授权

    详细内容见http://www.donews.net/robinblood/archive/2005/04/30/358041.aspx 转载于:https://www.cnblogs.com/pjd ...

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

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...

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

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...

  9. 基于OWIN WebAPI 使用OAuth授权服务【客户端验证授权(Resource Owner Password Credentials Grant)】...

    适用范围 前面介绍了Client Credentials Grant ,只适合客户端的模式来使用,不涉及用户相关.而Resource Owner Password Credentials Grant模 ...

最新文章

  1. QGC开发(一)---编译构建源码
  2. oracle运行企业管理器,如何打开Oracle 10g的企业管理器(Enterprise Manager)?
  3. Android 设计模式 - 观察者模式
  4. js事件技巧方法整合
  5. 互联网1分钟 | 0410 腾讯QQ上线陌生人社交入口“扩列”测试;支付宝小程序与UC浏览器打通...
  6. 截取字符串_jquery截取字符串中的数字
  7. PAT-乙级-1042 字符统计
  8. java中process方法用处_Java中ProcessBuilder应用实例
  9. Linux下profile environment bashrc的区别
  10. 教你在Kubernetes中快速部署ES集群
  11. 鸿蒙初开踏青时主要内容,鸿蒙初开踏青时
  12. delphi idtcpclient和idtcpserver的心跳包
  13. jenkins的安装与使用
  14. Android中复杂日历控件,CalenderView-一个优雅、高度自定义、性能高效的Android日历控件...
  15. 做过启动盘的U盘怎么复原?三种方法教你
  16. 程序员工资待遇,投票!
  17. 2018最新第三方支付牌照公司名单「完整」
  18. 设计模式——使用TypeScript实现代理模式
  19. 前端常用的一些插件、UI框架、js库,样式库以及官方文档。
  20. win7 host 中 vbox 虚拟机无法 attach USB device的问题

热门文章

  1. 程序员遇到问题的解决之道
  2. 修改vscode 窗口字体大小和编辑窗口字体大小
  3. c语言环境变量win10,设置系统环境变量是干嘛的?教你在哪设置win10环境变量
  4. 20190811:只出现一次的数字(四种解法)
  5. java项目中包的命名规范
  6. “芯”视野主题系列—— 加密芯片在医疗、美容行业内的应用
  7. Excel-VBA操作文件四大方法之三(3/4)
  8. VB 读取资源文件里面的字符串
  9. 网关屏蔽mac地址,linux下修改mac地址方法
  10. vb UTF文本文件访问