首页 > 编程语言 >ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)

ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)

时间:2024-09-30 10:54:05浏览次数:8  
标签:WebApi ASP 自定义 Token access token new NET

ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)

 

相关文章:ASP.NET WebApi OWIN 实现 OAuth 2.0

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

Accept: application/json
Content-Type: application/json
Authorization: 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<object>(null);
    }
}

测试效果:

或者直接简单粗暴的方式(不推荐),增加请求拦截,添加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);
        }
    }
}

项目源码:https://github.com/yuezhongxin/OAuth2.Demo/

参考资料:

标签:WebApi,ASP,自定义,Token,access,token,new,NET
From: https://www.cnblogs.com/sexintercourse/p/18441415

相关文章

  • 爱与恨的抉择:ASP.NET 5+EntityFramework 7
    爱与恨的抉择:ASP.NET5+EntityFramework7  EF7的纠缠ASP.NET5的无助忘不了你的好一开始列出的这个博文大纲,让我想到了很久之前的一篇博文:恋爱虽易,相处不易:当EntityFramework爱上AutoMapper,只不过这次的剧情换主角了,而且与EF和AutoMapper爱情故事不同的是,这次是......
  • 解决 ASP.NET Core MySql varchar 字符串截取(长度 255)
    解决ASP.NETCoreMySqlvarchar字符串截取(长度255) ASP.NETCore中使用MySql,如果字段类型为varchar,不管设置多少长度,插入或更新数据的时候,会自动截断(截取255长度的字符)。出现问题的原因,就是使用了MySql.Data.EntityFrameworkCore程序包(我使用的版本是7.0.7-m6),可能是......
  • [.NET Blog] .NET Aspire 测试入门
    https://devblogs.microsoft.com/dotnet/getting-started-with-testing-and-dotnet-aspire/自动化测试是软件开发的重要一环。它可以帮助我们尽早确认软件中的缺陷和防止回归问题。在本文中,我们将探讨如何在.NETAspire中开始测试,支持我们进行跨分布式应用的测试场景。测试分......
  • vue2 自定义empty指令
    主要思路定义一个echarts图标,数据为空,image采用base64编码图标宽高根据父宽高自适应渲染echarts函数,切换清除图例定义暂无数据指令定义option/***暂无数据*@param{number}width*@param{number}height*@returnsoption*/functionemptyChartOptionFn(w......
  • java-快速将普通main类变为javafx类,并加载自定义fxml
    java-快速将普通main类变为javafx类,并加载自定义fxml前提步骤1.普通类继承Application2.实现main方法3.写一个controller4.写一个fxml文件5.写start方法加载fxml6.具体代码7.运行即可前提使用自带javafx的jdk,这里使用的是jdk1.834,当然你可以使用其他的可行......
  • 开源模型应用落地-LangChain实用小技巧-文档分割器-自定义文档分割器(十三)
    一、前言  在LangChain框架中,文档分割器是一种将大段文本拆分成较小块或片段的算法或方法。其目标是创建可单独处理的可管理的片段,这在处理大型文档或数据集时通常是必要的。  而自定义文档分割器可以根据特定的需求和数据类型进行定制和配置,以便更好地适应应用程......
  • 【Ambari自定义组件集成】Ambari汉化,源码级修改手把手教程
    传统方式注意:此方法适合ambari-2.8.0注意:此方法适合ambari-2.8.0注意:此方法适合ambari-2.8.0Step1、找到代码位置:ambari-project\ambari-web\app\messages.js逐一替换Step2、下载我提供的汉化好的:message.jshttps://gitee.com/tt-bigdata/ambari-en-cn/blob/ma......
  • spring 常见注解记录+ 使用自定义注解与aop 记录接口请求参数
    注解定义:importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importorg.springframework.core.annotation.Alias......
  • Springboot自定义Prometheus采集指标
    添加依赖<!--增加Prometheus依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>io.micrometer&l......
  • Python基于自定义方法的排序
    Python基于自定义方法的排序在Python中,排序是一个常见的任务,它可以帮助我们根据特定的规则对数据结构(如列表)中的元素进行排序。Python的内置排序方法,如列表的sort()函数和内置函数sorted(),提供了非常灵活的排序机制,特别是通过key参数,我们可以指定一个自定义的函数来决定排序的顺......