我已经在我的 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 中添加了一个新按钮 - 授权。
问题是,它还在每个方法旁边添加了一个“打开”储物柜图标。尽管如此,其中一些需要授权。
当我使用授权按钮成功授权时(它基本上为每个请求添加了标头授权),我在所有请求上都会收到一个“关闭”的储物柜。 …
我在 .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 头中?
截至编写最新 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) 我正在研究 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)
我想直接从令牌中获取声明,因为:
[Authorize]属性,因此IHttpContextAccessor也不能使用。如何在 ASP Net Core 2.1 中实现这一点?如果有人想看看我如何添加用户声明:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbiIsIm5iZiI6MTU2ODYzNjYxMywiZXhwIjoxNTY4NjQ3NDEzLCJpYXQiOjE1Njg2MzY2MTN9.ED9x_AOvkLQqutb09yh3Huyv0ygHp_i3Eli8WG2S9N4
Run Code Online (Sandbox Code Playgroud)
我位于一个派生自IDocumentFilter(Swagger 类)的类中
Web API 项目 - ASP .NET Framework 4.8
代码流程如下:
1.) 调用 API -> 它必须调用另一个 API -> 2.) 获取 JWT 身份验证令牌 -> 3.) 调用所需的方法。
问题是,如果我的 API 被调用 100 次,我将对该GetJwtToken()方法进行 100 次调用,并为所需的方法本身再进行 100 次调用,这似乎是身份验证服务器上的开销。令牌本身的寿命为 2 小时。
关于如何在另一个 Web API 中管理 Web API JWT 令牌,是否有任何记录在案的最佳实践?
我已经尝试了以下解决方案,但我仍然不确定它们是否可以被视为良好做法。
Token和ValidTo与一个静态方法GetJwtToken()的更新这些属性。在每次调用所需的外部 API 方法之前,我们检查ValidTo属性并Token通过静态方法更新值(如果它已过期)。Token。调用外部 API 方法的方法被一个try catch块包围。该 Catch(WebException ex)预计如果令牌已过期未授权的例外。我检查 HTTP 状态代码 401 - 未经授权。if (response.StatusCode == …Run Code Online (Sandbox Code Playgroud) 我在一个类中有以下代码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) 我创建了一个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# ×6
asp.net-core ×3
jwt ×2
swagger ×2
swashbuckle ×2
.net ×1
.net-4.8 ×1
.net-6.0 ×1
attributes ×1
docker ×1
ironpdf ×1
javascript ×1
reflection ×1
signalr ×1
swagger-2.0 ×1
wss ×1