在 ASP.NET WebAPI 集成 Swagger 后,由于接口使用了 IdentityServer 做的认证,调试起来很不方便;看了下 Swashbuckle 的文档 ,是支持 OAuth2.0 的配置的,使用的简化模式(Implicit grant type),交互的流程如下:

Implicit Grant Type (简化模式)

参数:

  • response_type:表示授权类型,此处的值固定为"token",必选项。
  • client_id:表示客户端的ID,必选项。
  • redirect_uri:表示重定向的URI,可选项。
  • scope:表示权限范围,可选项。
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
    GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1Host: server.example.com

认证服务器回应客户端的URI,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

     HTTP/1.1 302 Found
     Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
               &state=xyz&token_type=example&expires_in=3600

Swagger 启用 OAuth 2.0 配置

Idrv 中配置客户端(Client)

new Client{ClientName = "Test_API_Flow",ClientId = "api_test_api_flow",Flow = Flows.Implicit,ClientUri = "https://identityserver.io",RequireConsent = true,AllowRememberConsent = true,RedirectUris = new List<string>{"http://localhost:39106/swagger/ui/o2c-html",},AllowedCorsOrigins = new List<string>{"http://localhost:39106"},AccessTokenLifetime = 3600,AccessTokenType = AccessTokenType.Jwt,AllowAccessToAllScopes=true},

API:

   app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions{Authority = IdsvSetting.Authority,ValidationMode = ValidationMode.ValidationEndpoint,RequiredScopes=new List<string> {"all","user","order"}} });

    /// <summary>/// 早餐控制器/// </summary>[RoutePrefix("api/v1/breakfast")]public class BreakfastController : ApiController{private static readonly Logger logger = LogManager.GetCurrentClassLogger();/// <summary>/// 早餐服务/// </summary>private readonly IBreakfastService _breakfastService;/// <summary>/// 构造方法/// </summary>/// <param name="breakfastService">早餐服务</param>public BreakfastController(IBreakfastService breakfastService){_breakfastService = breakfastService;}#region 获得酒店关联的餐厅的酒店/// <summary>/// 获得酒店关联的餐厅的酒店/// </summary>/// <param name="hotelcd">酒店编号</param>/// <returns>获得酒店关联的餐厅的酒店</returns>
        [Authorize][HttpGet][Route("{hotelcd}/mapping")]public async Task<IHttpActionResult> GetXhotelBreakfastHotelMappingRequest(string hotelcd){var response = await _breakfastService.GetXhotelBreakfastHotelMappingRequest(hotelcd);return Json(response);}#endregion}
}

配置 SwaggerConfig

   //https://tsso.xxx.cn/connect/authorize?response_type=token&redirect_uri=http%3A%2F%2Flocalhost%3A39106%2Fswagger%2Fui%2Fo2c-html&realm=test-realm&client_id=api_test_api_flow&scope=all%20%20&state=oauth2c.OAuth2("oauth2").Description("OAuth2 Implicit Grant").Flow("implicit").AuthorizationUrl("https://tsso.xxx.cn/connect/authorize")//.TokenUrl("https://sso.xxx.cn/connect/token").Scopes(scopes =>{scopes.Add("all", "all access to protected resources");scopes.Add("user", "user access to protected resources");scopes.Add("order", "order access to protected resources");});
...   

    c.OperationFilter<AssignOAuth2SecurityRequirements>();c.EnableOAuth2Support(clientId: "api_test_api_flow",clientSecret: null,realm: "test-realm",appName: "Swagger UI"//additionalQueryStringParams: new Dictionary<string, string>() { { "foo", "bar" } });

 public class AssignOAuth2SecurityRequirements : IOperationFilter{public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription){var actFilters = apiDescription.ActionDescriptor.GetFilterPipeline();var allowsAnonymous = actFilters.Select(f => f.Instance).OfType<OverrideAuthorizationAttribute>().Any();if (allowsAnonymous)return; // must be an anonymous method//var scopes = apiDescription.ActionDescriptor.GetFilterPipeline()//    .Select(filterInfo => filterInfo.Instance)//    .OfType<AllowAnonymousAttribute>()//    .SelectMany(attr => attr.Roles.Split(','))//    .Distinct();if (operation.security == null)operation.security = new List<IDictionary<string, IEnumerable<string>>>();var oAuthRequirements = new Dictionary<string, IEnumerable<string>>{{"oauth2", new List<string> {"all","user","order"}}};operation.security.Add(oAuthRequirements);}}

OK ,配置完成,点击红色的圈圈,登录成功会302到  http://localhost:39106/swagger/ui/o2c-htm 上

当然也可以退出授权:

REFER:

https://www.scottbrady91.com/Identity-Server/ASPNET-Core-Swagger-UI-Authorization-using-IdentityServer4
https://stackoverflow.com/questions/33752900/enable-oauth2-client-credentials-flow-in-swashbuckle
https://stackoverflow.com/questions/29275499/swagger-swashbuckle-oauth2-with-resource-owner-password-credentials-grant?rq=1
http://knowyourtoolset.com/2015/08/secure-web-apis-with-swagger-swashbuckle-and-oauth2-part-2/

转载于:https://www.cnblogs.com/Irving/p/7275065.html

ASP.NET WebAPI 集成 Swagger 启用 OAuth 2.0 配置问题相关推荐

  1. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  2. Springboot集成Swagger报错Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.Hat

    第一次尝试使用springboot完成后端开发,在做demo的过程中集成swagger发生报错. 其中,swagger版本为2.2.2,springboot版本为2.3.4 觉得可能是版本不匹配,将s ...

  3. .NET Core 3.0 webapi集成Swagger 5.0

    在项目中引用Swashbuckle.AspNetCore和Swashbuckle.AspNetCore.Filters两个dll,在Startup中的ConfigureServices相关配置代码如下 ...

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

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

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

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

  6. OAuth 2.0 Java指南:5分钟保护您的应用程序安全

    使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 今天尝试Okta. 现代应用程序依赖于用户身份验证,但是它可能给J ...

  7. Spring Security——OAuth 2.0 Client自动配置源代码分析

    基本概念 OAuth2.0:OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0). OAuth 2.0关注客户端开发者的简易性.要么通过组织在资源 ...

  8. 8. Spring Security 5.1之 OAuth 2.0 Login

    1.OAuth 2.0 Login OAuth 2.0登录功能为应用程序提供了使用OAuth 2.0提供程序(例如GitHub)或OpenID Connect 1.0提供程序(例如Google)上的现 ...

  9. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

最新文章

  1. 【Infragistics教程】在javascript类中添加静态成员属性
  2. ffmpeg使用总结
  3. MOSS2007的网站和工作区
  4. VTK:阴影灯用法实战
  5. LeetCode - 141. 环形链表
  6. 【转】JAVA中的转义字符
  7. excel range 判断日期型_EXCEL常用函数二
  8. uml边界类例子_UML中边界类、控制类和实体类
  9. android 排序view,Android 中ViewPager重排序与更新实例详解
  10. java9最新下载_java9下载_java9官方版下载 32位64位 最新版_天天下载手机版
  11. OBS 电脑推流直播指南
  12. 教你利用腾讯云cdn加速网站静态资源
  13. 30 个 Python 编程实用技巧
  14. 蓝牙资讯|Q2全球TWS耳机出货量排行出炉,蓝牙音频新技术将推出市场
  15. 前度字符串转数组_leetcode每日一题
  16. 简述机器指令与微指令之间的关系_机器指令与微指令有什么联系和区别?
  17. python编写自定义函数print_triangle(n)_Python 实验8 函数(1).doc
  18. 华为平板计算机的隐藏功能,华为平板MatePad的3种隐藏玩法,你都不知道呢
  19. 什么情况下,微信聊天里会出现【对方正在输入】,原来如此
  20. 验证谷角猜想。日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1。如此经过有限次运算后,总可

热门文章

  1. vue 下echarts卸载和安装指定版本
  2. eclipse安装m2e.sourcelookup插件debug第三方源码(spring)
  3. Caused by: java.lang.NoClassDefFoundError: Lorg/sl
  4. jmeter结果分析
  5. 8086实时时钟实验(二)——《x86汇编语言:从实模式到保护模式》读书笔记06
  6. 【放洋屁了】知识焦虑-几点感慨
  7. 【译】ICO 2.0 — The Advent of What Crypto-Fund Raising Should Really Look Like
  8. 肖仰华:知识图谱与认知智能
  9. Tensorflow Day16 Autoencoder 實作
  10. ARM Exploitation