【问题标题】:Adding BasicAuthentication to an ASP.NET Core 2.1 Web API project将 BasicAuthentication 添加到 ASP.NET Core 2.1 Web API 项目
【发布时间】:2021-01-28 11:39:08
【问题描述】:

我有一个面向 .NET Framework 4.6.2 的 ASP.NET Core 2.1 Web API 项目,现在我需要向它添加基本身份验证。在有人问之前,我需要以 .NET Framework 4.6.2 为目标,因为我仍在使用 EntityFramework 6(我们的 repo 采用数据库优先方法,我需要 EDMX 模型)。

网上找了几个例子,但都依赖注入的 IServiceCollection 对象的 AddAuthentication 方法。也许是因为我拥有的 .NET Core/.NET Framework 组合,在我的情况下,该方法不可用。相反,我有具有不同签名的 AddAuthenticationCore。我找不到 AddAuthenticationCode 方法的任何示例。任何人都可以帮忙吗? 谢谢, 埃德

编辑: 我找到了一些关于这个 AddAuthenticationCore 的信息,并在文档的帮助下,我在 ConfigureServices 方法中添加了这个:

     // add basic authentication
     services.AddAuthenticationCore(options =>
     {
        options.AddScheme<BasicAuthenticationHandler>("BasicAuthentication", null);
        options.DefaultAuthenticateScheme = "BasicAuthentication";
     });

我的 BasicAuthenticationHandler 类是这样贴花的:

public class BasicAuthenticationHandler : IAuthenticationHandler
{
  private HttpContext _context;

  public Task<AuthenticateResult> AuthenticateAsync()
  {
     if(_context.Request.Headers.ContainsKey("Authorization"))
     {
        return Task.FromResult(AuthenticateResult.Fail("Missing Authorization Header."));
     }

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

        if(username.Equals("My_User") && password.Equals("MyPassword"))
        {
           var claims = new[] {
              new Claim("UserId", username),
              new Claim("UserName", username),
           };
           var identity = new ClaimsIdentity(claims, "BasicAuthentication");
           var principal = new ClaimsPrincipal(identity);
           var ticket = new AuthenticationTicket(principal, "BasicAuthenticationScheme");

           return Task.FromResult(AuthenticateResult.Success(ticket));
        }
        else
        {
           return Task.FromResult(AuthenticateResult.Fail("Invalid User Name or Password"));
        }
     }
     catch
     {
        return Task.FromResult(AuthenticateResult.Fail("Invalid Authorization Header"));
     }
  }

  public Task ChallengeAsync(AuthenticationProperties properties)
  {
     throw new NotImplementedException();
  }

  public Task ForbidAsync(AuthenticationProperties properties)
  {
     throw new NotImplementedException();
  }

  public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
  {
     _context = context;
     return Task.FromResult<object>(null);
  }

}

我在 InitializeAsync 和 AuthenticateAsync 中都有断点,但没有一个被调用。即使 Autorization 标头包含错误的密码,我的调用也是成功的。知道为什么我的基本身份验证处理程序无效吗? 这里有类似的问题,其答案表明必须在 Configure 中调用 UseAuthentication。问题是我无权访问该方法:

【问题讨论】:

  • 尝试从 Nuget 安装 Microsoft.AspNetCore.Authentication。之后您应该可以致电IServiceCollection.AddAuthentication()
  • 谢谢@scharnyw。我安装了错误的 Microsoft.AspNetCore.Authentication.Core NuGet 包。我删除了它并安装了你提到的那个,现在调用了处理程序的方法。它仍然不能完美地工作,因为当凭据错误并且处理程序返回 AuthenticateResult.Fail 时,该过程继续进行并且正文保存在 repo 中。我必须弄清楚那个。
  • 我设法解决了这个问题。除了添加 Microsoft.AspNetCore.Authentication NuGet 包之外,我还必须做几件事:首先,我必须将 [Authorize] 属性添加到我的 Web API 控制器,其次我必须按照此处描述的步骤操作:jasonwatmore.com/post/2018/09/08/…
  • @scharnyw - 发布您的建议作为答案,我会接受。谢谢你的建议。
  • 你可能还想参考 Github 上的this implementation。作者是 Microsoft 安全 PM,因此可以提供一些额外的见解。它也可以在Nuget 上找到

标签: asp.net-core asp.net-web-api basic-authentication


【解决方案1】:

尝试从 Nuget 安装 Microsoft.AspNetCore.Authentication 包。它以 .NET Standard 为目标,因此可用于 .NET Core 和 Framework。之后您应该可以拨打IServiceCollection.AddAuthentication()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2015-10-28
    • 2017-11-24
    • 2021-05-22
    • 2020-11-04
    相关资源
    最近更新 更多