我有一个在 IIS 中运行的 ASP.NET Core WebApi 项目,并且始终支持 NTLM 和协商作为身份验证方法。我需要为一个特定端点添加基本身份验证,因此我为它创建了一个中间件:
public class BasicAuthMiddleware
{
private readonly RequestDelegate next;
public BasicAuthMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task InvokeAsync(HttpContext context, IOptions<List<BasicCredential>> credentials)
{
if (context.Request.Path.Value.Contains("/basicauthendpoint"))
{
var authHeader = (string)context.Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic "))
{
//Validate credentials here...
await next(context);
return;
}
context.Response.Headers["WWW-Authenticate"] = "Basic";
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
}
else
{
await next(context);
}
}
}
第一次按预期调用中间件,当没有身份验证标头时,它返回 401。然后浏览器显示用户名/密码对话框,我输入凭据并单击确定重新提交。
第二次调用中间件,仍然缺少authenticate header
这是浏览器的问题还是因为我设置了额外的身份验证方法?
在您的场景中,访问时添加标头无效
/basicauthendpoint
,这是预期的行为。
因为Web Server端无法改变客户端发送请求的行为。
登录应用程序时,我们可以生成和管理cookie。
在访问
/basicauthendpoint
时,我们可以修改当前的cookie,或者添加一些内容,以满足认证需求。