小编G.D*_*mov的帖子

ASP Net Core 2.2 仅向需要授权的方法添加储物柜图标 - Swagger UI

版本:

  • ASP 网络核心 Web API - 2.2
  • Swashbuckle.AspNetCore - 4.0.1

我目前有什么?

我已经在我的 Web API 项目中实现了 swagger。我在[Authorize]需要它的方法上使用带有属性的JWT 授权。

所以我想要一种能够发送需要授权的请求的简单方法。在我的ConfigureServices课堂上,我添加了以下逻辑。

services.AddSwaggerGen(c =>
{

    // Other swagger options

    c.AddSecurityDefinition("Bearer", new ApiKeyScheme
    {
        In = "header",
        Description = "Please enter into field the word 'Bearer' following by space and your JWT token",
        Name = "Authorization",
        Type = "apiKey"
    });
    c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
    {
        { "Bearer", Enumerable.Empty<string>() },
    });

    // Other swagger options
});

Run Code Online (Sandbox Code Playgroud)


它的作用如下:它在 swagger 中添加了一个新按钮 - 授权。

在此处输入图片说明

问题是,它还在每个方法旁边添加了一个“打开”储物柜图标。尽管如此,其中一些需要授权。

在此处输入图片说明

当我使用授权按钮成功授权时(它基本上为每个请求添加了标头授权),我在所有请求上都会收到一个“关闭”的储物柜。 …

c# authorization swagger swashbuckle asp.net-core

10
推荐指数
2
解决办法
2560
查看次数

SignalR 拒绝连接到 [url],因为它违反了以下内容安全策略指令

我在 .NET 4.8 中创建了一个 SignalR 项目。

我按照文档中的描述正确使用了 signalR 。我的两个脚本标签:

<script src="~/Scripts/jquery.signalR-2.4.1.js"></script>
<script src="https://mySignalRServer/signalr/hubs"></script>
Run Code Online (Sandbox Code Playgroud)

我通过以下方式初始化连接:

$.connection.hub.url = "https://mySignalRServer/signalr";
let screencasting = $.connection.screencastingHub;

$.connection.hub.qs = 'uuid=' + masterGuid + '&master=true';
$.connection.hub.logging = true;
screencasting.client.changeTransport = changeTransport;

$.connection.hub.start({ transport: 'webSockets' }).done(function () {
    console.log('---Connected to signalR server via WebSockets');
});
Run Code Online (Sandbox Code Playgroud)

当代码到达以下行时,$.connection.hub.start()会发生以下错误:

在此输入图像描述

jquery.signalR-2.4.1.js:1871 拒绝连接到 'wss://mySignalRServer/signalr/connect?transport=webSockets&clientProtocol=2.1&uuid=56b12321-1091-48aa-b52f-dc1407b3804a&master=true&connectionToken=WOP95HhCwdN7ogruYHpfrrs ZofenOqo5kRDVLJh6S6zUH0AN74cUTEL44qORGBCRMWiGH5ei12826qLB%2BMHFa7YqaN1KeIYmG7dUAE%2B6DiF2CIwanNTl4dwbwR6t3Cxgx&connectionData =%5B%7B%22name%22%3A%22screencastinghub%22%7D%5D&tid=8',因为它违反了以下内容安全策略指令:“connect-src https:”。

有趣的是,这段代码运行良好。会不会是证书错误?我怎样才能添加这个Content Security Policy (CSP)。(在此输入链接描述

它是否作为标题添加到某处?在 html 头中?

.net javascript wss signalr content-security-policy

8
推荐指数
1
解决办法
2478
查看次数

c# IronPdf 在 Linux Docker 下关闭.NET 6 Web API

版本

  • 用于 PDF 导出的单独 .NET 6.0 Web API
  • IronPdf.Linux - 2022.5.5629
  • IronPdf.Native.Chrome.Linux - 2022.5.5618

截至编写最新 IronPdf Linux NuGet 包之日
在此输入图像描述

问题

当我在 Docker Linux Container 下运行 .NET 6 Web API 时,当我点击 IronPdf 中的第一个方法时,应用程序会自行关闭this.pdfRenderer.RenderHtmlAsPdfAsync。没有错误或进入catch块,只是应用程序停止,我必须再次运行它。

我尝试了什么?代码

我正在关注 IronPdf 提供的官方文档:https ://ironpdf.com/docs/questions/docker-linux/

这是我的用例以及我如何使用 IronPdf 库:

[HttpGet]
[Route("Reporting/PDF/{reportItemId:int}"]
public async Task<IActionResult> GenerateReport(int reportItemId)
{
    try
    {
        IronPdf.Logging.Logger.EnableDebugging = true;
        IronPdf.Logging.Logger.LogFilePath = "Default.log"; //May be set to a directory name or full file
        IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;

        IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
        Installation.LinuxAndDockerDependenciesAutoConfig = false; …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api docker ironpdf .net-6.0

8
推荐指数
1
解决办法
2512
查看次数

直接从令牌中获取 JWT 声明,ASP Net Core 2.1

我正在研究 ASP Net Core 2.1 Web API。我已经在我的项目中成功实现了 JWT。具有授权的一切工作正常。

通常,当我需要用户声明时,我知道我可以像这样获得它们(例如电子邮件声明):

var claimsIdentity = User.Identity as ClaimsIdentity;
var emailClaim = claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email);
Run Code Online (Sandbox Code Playgroud)

问题是,我不在从ControllerBase类继承的控制器中,所以我没有任何User对象或[Authorize]属性。

我所拥有的是令牌本身。
例如

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbiIsIm5iZiI6MTU2ODYzNjYxMywiZXhwIjoxNTY4NjQ3NDEzLCJpYXQiOjE1Njg2MzY2MTN9.ED9x_AOvkLQqutb09yh3Huyv0ygHp_i3Eli8WG2S9N4
Run Code Online (Sandbox Code Playgroud)

我想直接从令牌中获取声明,因为:

  1. 我可以访问令牌。
  2. 我不在 Controller 类中,并且请求没有通过任何[Authorize]属性,因此IHttpContextAccessor也不能使用。

如何在 ASP Net Core 2.1 中实现这一点?如果有人想看看我如何添加用户声明:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbiIsIm5iZiI6MTU2ODYzNjYxMywiZXhwIjoxNTY4NjQ3NDEzLCJpYXQiOjE1Njg2MzY2MTN9.ED9x_AOvkLQqutb09yh3Huyv0ygHp_i3Eli8WG2S9N4
Run Code Online (Sandbox Code Playgroud)

我位于一个派生自IDocumentFilter(Swagger 类)的类中

c# jwt asp.net-core asp.net-core-webapi

7
推荐指数
3
解决办法
1万
查看次数

在另一个 Web API 中管理 Web API JWT 令牌的最佳实践

我的项目:

Web API 项目 - ASP .NET Framework 4.8

问题?

代码流程如下:

1.) 调用 API -> 它必须调用另一个 API -> 2.) 获取 JWT 身份验证令牌 -> 3.) 调用所需的方法。

问题是,如果我的 API 被调用 100 次,我将对该GetJwtToken()方法进行 100 次调用,并为所需的方法本身再进行 100 次调用,这似乎是身份验证服务器上的开销。令牌本身的寿命为 2 小时。

关于如何在另一个 Web API 中管理 Web API JWT 令牌,是否有任何记录在案的最佳实践?

我尝试了什么?

我已经尝试了以下解决方案,但我仍然不确定它们是否可以被视为良好做法。

  • 一个静态类有两个静态属性TokenValidTo与一个静态方法GetJwtToken()的更新这些属性。在每次调用所需的外部 API 方法之前,我们检查ValidTo属性并Token通过静态方法更新值(如果它已过期)。
  • 在我们的服务中,我们有一个静态私有字段Token。调用外部 API 方法的方法被一个try catch块包围。该 Catch(WebException ex)预计如果令牌已过期未授权的例外。我检查 HTTP 状态代码 401 - 未经授权。
if (response.StatusCode == …
Run Code Online (Sandbox Code Playgroud)

c# authentication jwt asp.net-web-api .net-framework-4.8

7
推荐指数
1
解决办法
1029
查看次数

C# CustomAttributeData 类到属性

我在一个类中有以下代码Swashbuckle.Swagger.IOperationFilter

List<CustomAttributeData> controllerAttributes = apiDescription
    .ActionDescriptor
    .ControllerDescriptor
    .ControllerType
    .CustomAttributes
    .Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

我正在成功获取该集合。我想将集合转换List<CustomAttributeData>为我的自定义属性的集合List<SwaggerFileInFormDataAttribute>

在此输入图像描述

我想将该System.Reflection.CustomAttributeData类转换为我的自定义属性SwaggerFileInFormDataAttribute


编辑 1:
这是我的SwaggerFileInFormDataAttribute属性的样子。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class SwaggerFileInFormDataAttribute : Attribute
{
    private ICollection<string> displayNames;

    public SwaggerFileInFormDataAttribute()
    {
        this.DisplayNames = new List<string> { "File" };
    }

    public SwaggerFileInFormDataAttribute(params string[] displayNames)
    {
        this.DisplayNames = displayNames;
    }

    public ICollection<string> DisplayNames
    {
        get
        {
            if (this.displayNames == null) …
Run Code Online (Sandbox Code Playgroud)

c# reflection attributes .net-4.8

5
推荐指数
1
解决办法
3461
查看次数

从 IDocumentFilter 中的 Method 和 Controller 获取所有 CustomAttributes,swashbuckle asp net core,swagger

版本:

  • 项目:ASP Net Core 2.1、Web API
  • 包:Swashbuckle.AspNetCore (4.0.1)

问题:

我创建了一个CheckIncludeForOperationFilter类,它继承Swashbuckle.AspNetCore.Swagger.IDocumentFilter并实现了这个接口需要的唯一方法 - public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)

这个类应该做什么?
它应该搜索IncludeForAttribute. 这意味着我应该检查 API 中的操作是否具有此属性或整个控制器。

我拥有的?

public class CheckIncludeForOperationFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {            
        foreach (var apiDescription in context.ApiDescriptions)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在调试模式下启动程序时,事情变得有趣了,我可以清楚地看到对象apiDescription有什么。它包含我搜索的所有内容。以下是操作属性:

apiDescription.ActionDescriptor.MethodInfo.CustomAttributes

和所有控制器属性:

apiDescription.ActionDescriptor.MethodInfo.DeclaringType.CustomAttributes

在此处输入图片说明

问题是,编译器MethodInfo在调试中显示了该属性,但是在我编写它时它却不见了。它以红色突出显示,我无权访问它:

在此处输入图片说明

如何获得所有属性?

干杯

c# swagger swagger-2.0 swashbuckle asp.net-core

3
推荐指数
1
解决办法
1618
查看次数