我必须构建一个简单的 netcore 2.2 服务(构建为库),它必须使用基本身份验证。
项目文件是:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net462</TargetFramework>
    <OutputType>Library</OutputType>

    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
    <OutDir>$(SolutionDir)bin\$(Configuration)\Modules\WebDataExport</OutDir>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authorization" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Routing" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.ComponentModel.Composition" />
  </ItemGroup>

</Project>

建造者是:

public IWebHost BuildWebHost(string[] args)
{
    var path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

    var config = new ConfigurationBuilder()
        .SetBasePath(path)
        .AddJsonFile("appsettings.json", optional: false)
        .Build();

    var webHost = WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext) =>
        {
        })
        .ConfigureServices(services =>
        {
            services.AddMvcCore().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            // configure basic authentication 
            services.AddAuthentication("BasicAuthentication")
                .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);

            // Add service for data access
            services.AddSingleton(_dataProvider);
        })
        .Configure(app =>
        {
            app.UseAuthentication();
            app.UseMvc();
        })
        .UseUrls($"http://*:{config.GetValue<int>("ListenPort")}")
        .UseKestrel();

    return webHost.Build();
}

还有我的控制器:

[Authorize]
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class GetRecordingsController : ControllerBase
{
    public GetRecordingsController(ILogger<GetRecordingsController> logger, IDataProvider dataProvider)
    {
    }

    [HttpGet]
    public async Task<IActionResult> Get([FromQuery] string From, 
                                         [FromQuery] string To)
    {
    }
}

最后,这是 BasicAuthenticationHandler :

public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    private readonly IDataProvider _dataProvider;

    public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
                                      ILoggerFactory logger,
                                      UrlEncoder encoder,
                                      ISystemClock clock,
                                      IDataProvider dataProvider) 
        : base(options, logger, encoder, clock)
    {
        _dataProvider = dataProvider;
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        if (!Request.Headers.ContainsKey("Authorization"))
            return AuthenticateResult.Fail("Missing Authorization Header");

        User user;
        try
        {
            var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
            var credentialBytes = Convert.FromBase64String(authHeader.Parameter);
            var credentials = Encoding.UTF8.GetString(credentialBytes).Split(new[] { ':' }, 2);
            var username = credentials[0];
            var password = credentials[1];                

            user = await _dataProvider.AuthenticateUser(username, password);
        }
        catch
        {
            return AuthenticateResult.Fail("Invalid Authorization Header");
        }

        if (user == null)
            return AuthenticateResult.Fail("Invalid Username or Password");

        var claims = new[] {
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Name, user.Username),
        };
        var identity  = new ClaimsIdentity(claims, Scheme.Name);
        var principal = new ClaimsPrincipal(identity);
        var ticket    = new AuthenticationTicket(principal, Scheme.Name);

        return AuthenticateResult.Success(ticket);
    }
}

现在,发生的情况是,如果我使用错误的密码发送 GET,则 HandleAuthenticateAsync 会正确返回失败,但无论如何都会调用我的 get 方法:未调用Microsoft.AspNetCore.Authorization.DefaultAuthorizationService

这是日志:

info: Sinora.Modules.WebDataExport.BasicAuthenticationHandler[7]
      BasicAuthentication was not authenticated. Failure message: Invalid Username or Password
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport)'
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Route matched with {action = "Get", controller = "GetRecordings"}. Executing action Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport)
 .....
    [METHOD EXECUTION]
 .....
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport)'
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 11384.1282ms 200

虽然我期待这样的事情:

info: Sinora.Modules.WebDataExport.BasicAuthenticationHandler[7]
      BasicAuthentication was not authenticated. Failure message: Invalid Username or Password
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport)'
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Route matched with {action = "Get", controller = "GetRecordings"}. Executing action Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport)

info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
      Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
      Executing ChallengeResult with authentication schemes ().
info: WebApi.Helpers.BasicAuthenticationHandler[12]
      AuthenticationScheme: BasicAuthentication was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport) in 11062.176ms

info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Sinora.Modules.WebDataExport.Controllers.GetRecordingsController.Get (Sinora.Modules.WebDataExport)'
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 11384.1282ms 200

我不知道我错在哪里

#1楼 票数:1

我认为您在启动文件中缺少以下调用

app.UseAuthorization();

我希望这能解决您的问题。

  ask by Barzo translate from so

未解决问题?本站智能推荐:

1回复

.net core 2.2 异步加载数据查看

我正在使用 wego api 列出航班。 但我会在每个请求中获得少量数据,所以我想将所有数据异步加载到视图中。 .net core 中是否有任何解决方案 对于数据提取,我使用以下代码。 所以到达查看后我不想停止数据获取。因为我只有 100 条记录,我需要查看剩余的数据,这里没有分页
2回复

.NET Core:当ApiController快捷方式管道时,根据错误请求访问请求数据

对于所有遇到的所有绊脚石问题,我在Github上创建了一个小型公共游乐场。 随时加入。 我仍在尝试针对我的请求的所有日志过滤器。 目标很简单。 无需在每个控制器方法中写入日志,只需在过滤器(或中间件)中实施一次日志,然后将其全局应用于所有日志即可。 当出现问题时可以使用它,我
21回复

目标进程退出时未引发 CoreCLR 启动事件错误,.NET Core 2.2

我想调试基于 .NET Core 2.2 的空 WebApi 项目。 我安装了Core 2.2 SDK x86并将目标框架更改为 2.2: 当我开始调试这个项目时, IIS启动,但在路由api/values我什么也没看到(它永远加载),我收到这个错误: 目标进程退出时未引发 CoreCL
2回复

使用.net核心API将XML文件下载到本地计算机

将XML文件从C#模型下载/导出到浏览器的本地计算机时遇到问题(我有前端)。 但是,我可以将文件从C#模型下载/导出到XML,并将其保存在服务器上的目录中。 我正在使用以下代码: 角度代码: 我需要帮助将此文件下载到运行浏览器的本地系统。 如果我需要更多信息,请告诉我。
1回复

如何在.net core 2.2中自定义问题细节进行异常处理

我想在 .Net Core API 项目中处理不同类型的异常并返回自定义错误响应。 例如授权错误、内部服务器错误、验证错误等,我想抛出常见的自定义错误。 为此,我正在考虑自定义问题详细信息。 内部服务器错误响应如下, 对于授权,错误响应如下所示, 对于数据库中不可用的数据,响应如下,
1回复

我应该如何在.NET Core 2.2中注册通用接口

我正在尝试使用通用存储库和服务创建新的.NET Core API,其中每个Type都有自己的相应实现接口。 我创建了一个通用的存储库和服务结构,但我似乎无法在startup.cs获得正确的注册,或者我正在做其他错误的事情。 任何帮助,将不胜感激! 我有一个正确注册的通用存储库:我的控制
2回复

如何在 .NET Core 2.2 应用程序中创建 CloudTableClient?

对于 .NET Core 2,这已经很长时间了! 我需要一个非常简单的东西 - 我需要在我的.NET Core 2.2应用程序中使用Microsoft.Azure.CosmosDB.Table包使用表存储。 好的,让我们这样做,好吗? 首先,让我们创建CloudTableClient : 好
2回复

在自托管的.net core 2.2应用程序上正确使用IsDevelopement()

我有一个自托管的.NET Core 2.2控制台应用程序,该应用程序不使用Web主机构建器,因为我不需要此服务的HTTP端点。 我正在尝试通过托管环境的IsDevelopment()方法来利用环境变量,但是它总是以Production形式返回。 以下是我设置主机构建器的方式。 我有