【发布时间】: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