博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)
阅读量:7236 次
发布时间:2019-06-29

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

相关文章:

之前的项目实现,Token 放在请求头的 Headers 里面,类似于这样:

Accept: application/jsonContent-Type: application/jsonAuthorization: Bearer pADKsjwMv927u...

虽然这是最标准的实现方式,但有时候我们会面对一些业务变化,比如 Token 要求放在 URL 或是 Post Body 里面,比如这样:

https://www.domain.com/api/MyController?access_token=pADKsjwMv927u...

ASP.NET WebApi OWIN 实现上面的需求,有很多种方式,这边只记录两种。

第一种方式,重写OAuthBearerAuthenticationOptions,将Startup.Auth.cs改造如下:

public partial class Startup{    public void ConfigureAuth(IAppBuilder app)    {        var OAuthOptions = new OAuthAuthorizationServerOptions        {            AllowInsecureHttp = true,            AuthenticationMode = AuthenticationMode.Active,            TokenEndpointPath = new PathString("/token"), //获取 access_token 认证服务请求地址            AuthorizeEndpointPath=new PathString("/authorize"), //获取 authorization_code 认证服务请求地址            AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(100), //access_token 过期时间            Provider = new OpenAuthorizationServerProvider(), //access_token 相关认证服务            AuthorizationCodeProvider = new OpenAuthorizationCodeProvider(), //authorization_code 认证服务            RefreshTokenProvider = new OpenRefreshTokenProvider() //refresh_token 认证服务        };        app.UseOAuthBearerTokens(OAuthOptions); //表示 token_type 使用 bearer 方式        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()        {            //从url中获取token,兼容hearder方式            Provider = new QueryStringOAuthBearerProvider("access_token")        });    }}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(null);    }}

测试效果:

435188-20180603220904408-640051062.png

或者直接简单粗暴的方式(不推荐),增加请求拦截,添加Application_BeginRequest代码如下:

protected void Application_BeginRequest(object sender, EventArgs e){    //从url中获取token的另外一种解决方式    if (ReferenceEquals(null, HttpContext.Current.Request.Headers["Authorization"]))    {        var token = HttpContext.Current.Request.Params["access_token"];        if (!String.IsNullOrEmpty(token))        {            HttpContext.Current.Request.Headers.Add("Authorization", "Bearer " + token);        }    }}

项目源码:

参考资料:

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

你可能感兴趣的文章
IOS UIPickView+sqlite 选择中国全部城市案例
查看>>
Cocos2d-x 3.0的启动流程
查看>>
ES6模板字面量
查看>>
使用SpannableString实现一个load小动画
查看>>
CSS高度自适应 height:100%;
查看>>
jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
查看>>
java多线程异步执行
查看>>
原生JS实现各种经典网页特效——Banner图滚动、选项卡切换、广告弹窗等
查看>>
SEO如何写好文章标题
查看>>
Android零基础入门第3节:带你一起来聊一聊Android开发环境
查看>>
已阻止安装程序vs2015
查看>>
POJ--2406Power Strings+KMP求字符串最小周期
查看>>
zookeeper常用命令
查看>>
mysql row模式查看原始sql
查看>>
Java 泛型 五:泛型与数组
查看>>
利用js动态创建<style>
查看>>
Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)
查看>>
App上线Check List
查看>>
广播接收者实现IP拨号
查看>>
关于mysql编码问题
查看>>