【问题标题】:Use the current UserManager in another controller在另一个控制器中使用当前的 UserManager
【发布时间】:2020-07-05 20:22:36
【问题描述】:

您好,我有 2 个控制器:

  • 应用用户控制器
  • ApplicationProductController

如何使用ApplicationUserController _userManager 只允许ApplicationProductController 内的[Authorize] 请求。每次我尝试将新产品注册为授权用户时,都会收到此错误:

System.InvalidOperationException: Unable to resolve service for type 'MyAPI.Controllers.ApplicationUserController' while attempting to activate 'MyAPI.Controllers.ApplicationProductController'. at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) at lambda_method(Closure , IServiceProvider , Object[] ) at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End of stack trace from previous location where exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() --- End of stack trace from previous location where exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at AspNetCoreRateLimit.RateLimitMiddleware 1.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

【问题讨论】:

    标签: c# asp.net .net-core


    【解决方案1】:

    确保您的Controller 类上方有[Authorize] 属性,以使用户有权访问控制器和方法,否则将他们重定向到登录页面。

    我认为您正在尝试 inject 另一个控制器 (ApplicationProductController) 中的控制器 (ApplicationUserController)。错了,把构造函数的参数去掉。

    您不必将UserManager 注入控制器以确保用户有权访问控制器。

    引发此错误是因为您试图将一些未在Dependency Injection 中注册的东西注入您的控制器。 请检查ApplicationUserController 的构造函数,并确保所有参数都在DI 中注册到项目根目录下的Startup.cs 文件中。

    通过检查ApplicationUserController 构造函数和ApplicationProductController 构造函数之间的差异,您可以更轻松地找到错误原因。

    希望对你有所帮助。

    【讨论】:

    • 看来问题出在Authorize 位置以及我设置的第二个UserManager 位置。现在唯一的问题是我无法获取注册产品的用户的 ID:string userId = User.Claims.First(c => c.Type == "UserID").Value; ApplicationUser user = await _userManager.FindByIdAsync(userId);
    • 如果您只需要用户名,请使用:var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
    • 如果您需要用户:var user = await _userManager.GetUserAsync(User); 其中User 可在控制器中访问。它来自控制器基地。
    • 试过这些行似乎问题仍然存在我不知道如何在控制器基础中设置User
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多