asp.net-core-webapi - NSwag 无法识别自定义授权属性
问题描述
目前在自定义授权属性上存在 NSwag 生成问题。我在其他地方完全找不到关于这个问题的任何东西。
我为我的 WebAPI 创建了一个自定义属性,并且或多或少遵循了此处推荐的模式
internal class AuthorizeWithPermissionAttribute : AuthorizeAttribute
{
const string POLICY_PREFIX = "HasPermission";
public AuthorizeWithPermissionAttribute(string permission) { // logic excluded for brevity }
public string Permission
{
get { // code }
set { // code }
}
}
然后我像这样用这个属性装饰我的控制器
[AuthorizeWithPermission("MY_PERMISSION_NAME")]
public class MyController: ControllerBase
{
// Controller logic.
}
到目前为止我已经尝试过
- 在属性上创建公共无参数构造函数
- 更改构造函数参数的类型(枚举、整数、字符串)
- 应用于
[OpenApiIgnore]
类型,然后在Startup.cs
不起作用时编写自定义过滤器 - 在类和属性级别更改访问修饰符
- 直接将属性广泛应用于控制器和方法。
这是我得到的错误:
Executing file 'nswag.json' with variables 'Configuration=Debug'...
3> Launcher directory: %UserDirectory%\.nuget\packages\nswag.msbuild\13.8.2\tools\NetCore31
3> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
3> ---> System.NullReferenceException: Object reference not set to an instance of an object.
3> at %SLNNAME%.Authorization.Attributes.AuthorizeWithPermissionAttribute..ctor(String permission) in %SLNDirectory%\Authorization\Attributes\AuthorizeWithPermissionAttribute.cs:line 14
3> at System.Reflection.CustomAttribute._CreateCaObject(RuntimeModule pModule, RuntimeType type, IRuntimeMethodInfo pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs)
3> at System.Reflection.CustomAttribute.CreateCaObject(RuntimeModule module, RuntimeType type, IRuntimeMethodInfo ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs)
3> at System.Reflection.CustomAttribute.AddCustomAttributes(ListBuilder`1& attributes, RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1 derivedAttributes)
3> at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType)
3> at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
3> at System.RuntimeType.GetCustomAttributes(Boolean inherit)
3> at Microsoft.AspNetCore.Mvc.ApplicationModels.DefaultApplicationModelProvider.CreateControllerModel(TypeInfo typeInfo)
3> at Microsoft.AspNetCore.Mvc.ApplicationModels.DefaultApplicationModelProvider.OnProvidersExecuting(ApplicationModelProviderContext context)
3> at Microsoft.AspNetCore.Mvc.ApplicationModels.ApplicationModelFactory.CreateApplicationModel(IEnumerable`1 controllerTypes)
3> at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.GetDescriptors()
3> at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.OnProvidersExecuting(ActionDescriptorProviderContext context)
3> at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.UpdateCollection()
3> at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.Initialize()
3> at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.get_ActionDescriptors()
3> at Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider.get_ApiDescriptionGroups()
3> at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateAsync(Object serviceProvider)
3> at NSwag.AspNetCore.OpenApiDocumentProvider.GenerateAsync(String documentName)
3> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToSwaggerCommand.GenerateDocumentWithDocumentProviderAsync(IServiceProvider serviceProvider) in C:\projects\nswag\src\NSwag.Commands\Commands\Generation\AspNetCore\AspNetCoreToOpenApiCommand.cs:line 287
3> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToSwaggerCommand.GenerateDocumentAsync(AssemblyLoader assemblyLoader, IServiceProvider serviceProvider, String currentWorkingDirectory) in C:\projects\nswag\src\NSwag.Commands\Commands\Generation\AspNetCore\AspNetCoreToOpenApiCommand.cs:line 276
3> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToOpenApiGeneratorCommandEntryPoint.<>c__DisplayClass0_0.<<Process>b__0>d.MoveNext() in C:\projects\nswag\src\NSwag.Commands\Commands\Generation\AspNetCore\AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs:line 30
3> --- End of stack trace from previous location where exception was thrown ---
3> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToOpenApiGeneratorCommandEntryPoint.Process(String commandContent, String outputFile, String applicationName) in C:\projects\nswag\src\NSwag.Commands\Commands\Generation\AspNetCore\AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs:line 29
3> --- End of inner exception stack trace ---
3> at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
3> at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
3> at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
3> at NSwag.AspNetCore.Launcher.Program.Main(String[] args) in C:\projects\nswag\src\NSwag.AspNetCore.Launcher\Program.cs:line 170
3> System.InvalidOperationException: Swagger generation failed with non-zero exit code '1'.
3> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToSwaggerCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in C:\projects\nswag\src\NSwag.Commands\Commands\Generation\AspNetCore\AspNetCoreToOpenApiCommand.cs:line 221
3> at NSwag.Commands.NSwagDocumentBase.GenerateSwaggerDocumentAsync() in C:\projects\nswag\src\NSwag.Commands\NSwagDocumentBase.cs:line 280
3> at NSwag.Commands.NSwagDocument.ExecuteAsync() in C:\projects\nswag\src\NSwag.Commands\NSwagDocument.cs:line 81
3> at NSwag.Commands.Document.ExecuteDocumentCommand.ExecuteDocumentAsync(IConsoleHost host, String filePath) in C:\projects\nswag\src\NSwag.Commands\Commands\Document\ExecuteDocumentCommand.cs:line 86
3> at NSwag.Commands.Document.ExecuteDocumentCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in C:\projects\nswag\src\NSwag.Commands\Commands\Document\ExecuteDocumentCommand.cs:line 32
3> at NConsole.CommandLineProcessor.ProcessSingleAsync(String[] args, Object input)
3> at NConsole.CommandLineProcessor.ProcessAsync(String[] args, Object input)
3> at NConsole.CommandLineProcessor.Process(String[] args, Object input)
3> at NSwag.Commands.NSwagCommandProcessor.Process(String[] args) in C:\projects\nswag\src\NSwag.Commands\NSwagCommandProcessor.cs:line 56
3> %SLNDirectory%.csproj(59,5): error MSB3073: The command "dotnet "%UserDirectory%\.nuget\packages\nswag.msbuild\13.8.2\build\../tools/NetCore31/dotnet-nswag.dll" run nswag.json /variables:Configuration=Debug" exited with code -1.
3> Done executing task "Exec" -- FAILED.
解决方案
逻辑!LOGIC IN 构造函数是问题所在。在这里有效。希望有人不会像我一样在这上面花费两个小时
public class AuthorizeWithPermissionAttribute : AuthorizeAttribute
{
const string POLICY_PREFIX = "HasPermission";
public AuthorizeWithPermissionAttribute(string permission)
{
this.Permission = permission;
}
public string Permission { get => Policy; set => Policy = $"{POLICY_PREFIX}{value}"; }
}
推荐阅读
- regex - 如何从 Datastudio 中的 URL 中提取 ID?
- tensorflow - 在 TensorFlow 对象检测 API 中冻结变量
- android - 如何从 PC 获取 UDP 数据到 android 模拟器?
- swift - 无法将“__NSDictionaryI”类型的值转换为“NSData”
- reactjs - 如何将默认值设置为 KeyboardDatePicker
- mysql - MS 访问无法使用复合键或复合键链接 mysql 表
- bash - 在命令中设置变量与在命令之前设置变量之间的区别
- excel - 如何在 Excel 上水平返回唯一值
- webpack - Webpack - 错误 [ERR_PACKAGE_PATH_NOT_EXPORTED]:没有定义“出口”主要
- single-sign-on - 想要将 argo 服务器与 keycloak 集成