OAuth2.0资料

初衷:一直想整理授权系列demo,让自己项目高端大尚,列出新手授权系列,帮助小白程序员不用在为授权头疼      

        OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的 2 小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth 让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

以上概念来自:https://zh.wikipedia.org/wiki/OAuth

详细理论知识,参考文章如下文章,本文章重在实践

1.http://www.cnblogs.com/lanxiaoke/p/6358332.html

2.https://www.cnblogs.com/selimsong/p/8037717.html

3.http://www.cnblogs.com/xishuai/p/aspnet-webapi-owin-oauth2.html

项目实践开发

步骤1和步骤2都行,看官乐意就行

步骤1

通过NuGet安装

Microsoft.Owin.Security.OAuth

Owin Microsoft.Owin.Host.SystemWeb(重点)

步骤2

Owin Microsoft.Owin.Host.SystemWeb(重点)

Microsoft.Owin.Security.OAuth

Microsoft.Owin.Security.Cookies(可忽略)

Microsoft.AspNet.Identity.Owin

重点在于步骤1少了一个核心dll,少了这个核心dll无法启动部署owin

新增Startup.cs

[assembly: OwinStartup(typeof(OAuth2.Startup))]
namespace OAuth2
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
    }
}

Owin Microsoft.Owin.Host.SystemWeb 通过这个dll,程序启动时候注册,如果不引用,该方法不会生效,看官可以打个断点试一试

新增Startup.Auth.cs

namespace OAuth2
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
            {
                //从url中获取token,兼容hearder方式
                //Provider = new QueryStringOAuthBearerProvider("access_token")
            });
            var OAuthOptions = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"), //获取 access_token 认证服务请求地址
                AuthorizeEndpointPath = new PathString("/authorize"), //获取 authorization_code 认证服务请求地址
                AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(3600), //access_token 过期时间

                Provider = new OpenAuthorizationServerProvider(), //access_token 相关认证服务
                AuthorizationCodeProvider = new OpenAuthorizationCodeProvider(), //authorization_code 认证服务
                RefreshTokenProvider = new OpenRefreshTokenProvider() //refresh_token 认证服务
            };

            app.UseOAuthBearerTokens(OAuthOptions); //表示 token_type 使用 bearer 方式



        }
    }

    public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
    {
        readonly string _name;

        public QueryStringOAuthBearerProvider(string name)
        {
            _name = name;
        }

        public override Task RequestToken(OAuthRequestTokenContext context)
        {
            var value = context.Request.Query.Get(_name);

            if (!string.IsNullOrEmpty(value))
            {
                context.Token = value;
            }

            return Task.FromResult<object>(null);
        }
    }

}

眼光犀利的同学肯定注意到这两个类名相同,命名空间也相同,为什么没有报错  请注意关键字 partial 

OpenAuthorizationServerProvider示例代码  详细见demo,只提代码需要注意地方

        /// <summary>
        /// 验证 client 信息
        /// </summary>
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            string clientId;
            string clientSecret;
            if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
            {
                context.TryGetFormCredentials(out clientId, out clientSecret);
            }

            if (clientId != "xishuai" || clientSecret != "123")
            {
                context.SetError("invalid_client", "client or clientSecret is not valid");
                return;
            }
            context.Validated();
        }

        public string BaseString()
        {
            string clientId = "xishuai";
            string clientSecret = "123";
            return Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret));
        }
验证生效如图 按照如下格式 key:value,然后base64编码 
context.TryGetBasicCredentials 否则解析不了 验证不通过

OpenAuthorizationCodeProvider示例代码 详细见demo

OpenRefreshTokenProvider 示例代码 详细见demo

新增ValueController.cs

public class ValueController : ApiController
    {
        // GET api/values  access_token验证才能访问
        [Authorize]
        [HttpGet]
        public IEnumerable<string> Index()
        {
            return new string[] { "value1", "value2" };
        }
        
//获取授权code [HttpGet] [Route(
"api/authorization_code")] public HttpResponseMessage Get(string code) { return new HttpResponseMessage() { Content = new StringContent(code, Encoding.UTF8, "text/plain") }; } }

新增OAuthon2Controller.cs

    public class OAuthon2Controller : Controller
    {
        //根据你项目端口
        private const string HOST_ADDRESS = "http://localhost:60903";

        // GET: OAuthon2   直接获取授权code链接,方便获取code
        public string Index()
        {
            string clientId = "xishuai";
            string url = $"{HOST_ADDRESS}/authorize?grant_type=authorization_code&response_type=code&client_id={clientId}&redirect_uri={HttpUtility.UrlEncode($"{HOST_ADDRESS}/api/authorization_code")}";
            return url;
        }

    }

根据获取的url,   在将红色部分url复制出来到浏览器中可以获取到code

现在code有了  将获取access_token

1

grant_type:authorization_code

code:图上红色url返回给你的

client_id:xishuai 可以理解为appid  自定义,因为代码中固定了,你可以改

redirect_uri:这个链接你也能改的,接受code 在ValueController.cs   (action:api/authorization_code)

http://localhost:60903/api/authorization_code

这个地方需要注意  需要和你获取code redirect_uri保持一致就行

string url = $"{HOST_ADDRESS}/authorize?grant_type=authorization_code&response_type=code&client_id={clientId}&redirect_uri={HttpUtility.UrlEncode($"{HOST_ADDRESS}/api/authorization_code")}";

然后你就拿到access_token 去调用 api/Value/Index

2

如果这个地方你输入错,会获取失败

Authorization     Bearer后面空格 在输入access_token 

源码下载

posted @ 2018-07-21 21:16 KiSs_小白 阅读(5738) 评论(9) 推荐(3) 编辑
摘要: OAuth2.0资料 今天看到一篇博主写了该系列文章,贴图和过程都比较详细,俗话说实践是检验真理的唯一标准(如果是按照参考文章复制粘贴,应该不会出现踩坑,但是我喜欢自己手动敲一遍),发现几个坑,因而总结下经验,让其他小白同学少走弯路 参考第一篇:https://www.cnblogs.com/cby 阅读全文
posted @ 2018-07-10 09:18 KiSs_小白 阅读(2990) 评论(2) 推荐(3) 编辑
摘要: Log4net的优点 log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。程序运行过程中就能生成并输出日志信息而无需人工干预,可供开发人员尽快找到应用程序中的Bug。另外,日志信息可以输出到不同的地 阅读全文
posted @ 2018-07-03 10:34 KiSs_小白 阅读(886) 评论(1) 推荐(0) 编辑
摘要: 1.前言 CSRF(Cross-site request forgery)跨站请求伪造,ASP.NET MVC 应用通过使用AJAX请求来提升用户体验,浏览器开发者工具可以一览众山小,就很容易伪造了请求对应用进行攻击,从而泄露核心数据,导致安全问题。微软自带AntiForgeryToken可以解决, 阅读全文
posted @ 2018-07-02 17:26 KiSs_小白 阅读(705) 评论(0) 推荐(0) 编辑
摘要: 时间戳作用 客户端在向服务端接口进行请求,如果请求信息进行了加密处理,被第三方截取到请求包,可以使用该请求包进行重复请求操作。如果服务端不进行防重放攻击,就会服务器压力增大,而使用时间戳的方式可以解决这一问题。 上一篇讲到JWT安全验证操作,现在结合时间戳进行防重复攻击和被第三方抓包工具截取到Hea 阅读全文
posted @ 2018-06-30 10:45 KiSs_小白 阅读(3656) 评论(8) 推荐(1) 编辑
摘要: Json Web Token(jwt) 一种不错的身份验证及授权方案,与 Session 相反,Jwt 将用户信息存放在 Token 的 payload 字段保存在客户端,通过 RSA 加密的方式,保证数据不会被篡改,验证数据有效性。 详细请参考jwt.io。 我现在还是一枚小白,希望能帮助更多的小 阅读全文
posted @ 2018-06-29 12:13 KiSs_小白 阅读(14004) 评论(13) 推荐(8) 编辑
摘要: Exceptionless 一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web API,Web Forms,WPF,Console,ASP.NET MVC 等技术开发的应用程序中,并且提供了REST接口可以应用在 Javascript,Node.js 中 阅读全文
posted @ 2018-06-28 14:12 KiSs_小白 阅读(2040) 评论(2) 推荐(0) 编辑
摘要: 新手上路,老司机请多多包含!Ocelot 在博园里文章特别多,但是按照其中一篇文章教程,如果经验很少或者小白,是没法将程序跑向博主的结果. 因此总结下 参考多篇文章,终于达到预期效果。 Ocelot 目标是使用.NET运行微服务/面向服务架构,我们需要一个统一的入口进入我们的服务,提供监控、鉴权、负 阅读全文
posted @ 2018-06-08 16:02 KiSs_小白 阅读(641) 评论(4) 推荐(2) 编辑
点击右上角即可分享
微信分享提示