当前位置: 首页 > 知识库问答 >
问题:

Get Microsoft.Identity(前 AzureAD)与 Swagger 合作

有骏奇
2023-03-14

我有一个 ASP.Net 5 Web API,它使用Microsoft.identity.Web软件包进行保护,因此它由Azure Active Directory支持。API本身中的身份验证工作正常,没有任何问题。

想获得在Swagger UI内部工作的授权的时候很纠结。我正在使用授权代码流,起初一切似乎都很好(我进入Microsoft登录屏幕,可以输入我的凭据并接收授权代码)。

这是我的Startup.cs中的代码

services.AddSwaggerGen(c =>
{
    c.AddSecurityDefinition("msid", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
    {
        Type = Microsoft.OpenApi.Models.SecuritySchemeType.OAuth2,
        Flows = new Microsoft.OpenApi.Models.OpenApiOAuthFlows
        {
            AuthorizationCode = new Microsoft.OpenApi.Models.OpenApiOAuthFlow
            {
                AuthorizationUrl = new System.Uri("https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize"),
                TokenUrl = new System.Uri("https://login.microsoftonline.com/organizations/oauth2/v2.0/token"),
                Scopes = new Dictionary<string, string>
                {
                    { "api://myClientId/access", "access" }
                }
            }
        }
    });

    c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
    {
        {
            new Microsoft.OpenApi.Models.OpenApiSecurityScheme
            {
                Reference = new Microsoft.OpenApi.Models.OpenApiReference {Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, Id = "msid" }
            },
            new [] { "api://myClientId/access" }
        }
    });
});

这是从Swagger UI发送到的请求https://login.microsoftonline.com/organizations/oauth2/v2.0/token

POST https://login.microsoftonline.com/organizations/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Connection: keep-alive
Content-Length: 1086
Pragma: no-cache
Cache-Control: no-cache
sec-ch-ua: "Chromium";v="94", "Microsoft Edge";v="94", ";Not A Brand";v="99"
Accept: application/json, text/plain, */*
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4585.0 Safari/537.36 Edg/94.0.972.0
sec-ch-ua-platform: "Windows"
Origin: https://localhost:5003
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://localhost:5003/
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en;q=0.8,en-US;q=0.7

grant_type=authorization_code&code=hereIsMyLongAuthorizationCode&redirect_uri=https%3A%2F%2Flocalhost%3A5003%2Fswagger%2Foauth2-redirect.html

这是回应

HTTP/1.1 200 OK
Cache-Control: no-store, no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
x-ms-request-id: 683dc687-7211-400b-ab02-bccdc6e9ba00
x-ms-ests-server: 2.1.11898.12 - WEULR1 ProdSlices
report-to: {"group":"network-errors","max_age":86400,"endpoints":[{"url":"https://identity.nel.measure.office.net/api/report?catId=GW+estsfd+dub2"}]}
nel: {"report_to":"network-errors","max_age":86400,"success_fraction":0.001,"failure_fraction":1.0}
Set-Cookie: fpc=...; expires=Fri, 03-Sep-2021 13:57:11 GMT; path=/; secure; HttpOnly; SameSite=None
Set-Cookie: x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly
Set-Cookie: stsservicecookie=estsfd; path=/; secure; samesite=none; httponly
Referrer-Policy: strict-origin-when-cross-origin
Date: Wed, 04 Aug 2021 13:57:10 GMT
Content-Length: 1763

{"token_type":"Bearer","scope":"api://myClientId/access","expires_in":3599,"ext_expires_in":3599,"access_token":"theToken"}

共有1个答案

谢财
2023-03-14

正确的方法是使用隐式流,同时保持其他所有内容相同。该流适用于 JS 应用程序,在这些应用程序中,如果用户无法看到客户端密钥,则无法安全地发送客户端密钥。

 类似资料:
  • 我用.NET Framework 4.7.2 asp.net mvc项目。现在,我将 Swagger nuget 包(Install-Package Swashbuckle -Version 5.6.0)添加到了这个现有项目中。帖子,我看到一个 SwaggerConfig.cs添加到解决方案资源管理器的 App_Start 文件夹。 在这里,指向服务器的应用程序使用 asp.net mvc 控制器

  • 我正在使用springbootersey进行web restful实现。现在我要将swagger集成到我们的应用程序中。我做了以下操作。 我添加了以下对build.gradle的依赖: 我能够启动这个web应用程序,但我想知道哪个url是用来招摇的?我试过了http://localhost:8080, http://localhost:8080/swagger和http://localhost:8

  • Jboot 已经整合了对 Swagger 的支持,但是默认情况下并未依赖 Swagger 的相关依赖,因此,在使用 Swagger 之前需要添加如下的依赖: <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-core</artifactId> <version>1.5.21</version> </

  • 使用4.0.31,我的AppHost配置方法是这样声明的: 我的印象是,这将把swagger用户界面的url设置为.../api/Resources的https版本,但是我仍然在swagger URL文本框中获得常规的超文本传输协议endpoint,例如: 我们的web服务器位于执行SSL卸载(并需要SSL)的负载平衡器之后,因此URL应为: 一个积极的方面是,使用“UseHttpsLinks”实

  • 我有一个功能性的Web API项目。我如何才能以最少的努力将其改造成像Swagger留档/设计http://petstore.swagger.wordnik.com/ Web API本身是否有类似Swagger的本机功能?

  • 我正在使用AzureAd Powershell模块进行用户管理。但是,它并不具备我所需要的所有功能,特别是,我不能为对象分配应用程序扩展值(尽管我可以通过创建删除和删除应用程序扩展本身)。 通过观察使用Fiddler的API调用,我知道graph调用使用了承载令牌,并且我直接从Postman手动调用了graph API,所以如果可以的话,我知道如何使用承载令牌。我怎么拿到?