我正在和谈判-身份验证。我尝试创建的是一个在Windows服务器上的内部网中运行的API,任何调用此API的用户都将使用其当前Windows帐户自动进行身份验证。这就是我认为此身份验证处理程序的目的。我创建了一个非常简单的API,它只进行身份验证并返回当前身份名称。这样我就想检查身份是否调用用户或仅是服务器运行环境上的当前已验证用户。
Program.cs
using Microsoft.AspNetCore.Authentication.Negotiate;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = options.DefaultPolicy;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseCors(x =>
{
x.AllowAnyMethod().AllowAnyOrigin().AllowAnyHeader();
});
app.UseAuthorization();
app.MapControllers();
app.Run();
字符串
Controller.cs
using Microsoft.AspNetCore.Authentication.Negotiate;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication2.Controllers
{
[ApiController]
[Route("controller")]
public class Controller : ControllerBase
{
[HttpGet]
[Route("auth")]
[Authorize(AuthenticationSchemes = NegotiateDefaults.AuthenticationScheme)]
public string Get()
{
return this.User.Identity!.Name!;
}
}
}
型
当在本地运行这个API并使用Swagger发送请求时,我得到了身份验证,并返回了我的域名和用户名。当我使用Postman发送请求时,我没有得到身份验证,但我得到了状态401。我试图调试身份验证和授权中间件以及Negotiatetransom。
NegotiateError从未真正调用。HandleRequestAsync
被调用但立即返回,因为Options.DeferToServer
是true
,并且HandleAuthenticateAsync
和HandleChallengeAsync
从未被调用(符号加载但断点从未命中)
身份验证和授权中间件似乎都没有任何作用,因为当这两个中间件都被调用时,Windows标识已经存在于HttpContext中。
所以我不知道这个标识来自哪里,也不知道它是调用客户端的标识还是服务器运行环境的标识。此外,我不知道为什么我在使用Swagger时得到了身份验证,而在使用Postman时却没有。我无法识别Postman发送的任何有助于识别我的头。
谁能澄清这一点,如果我错了,告诉我谈判是好的?
编辑:
当我在appsettings.json
中指定URL来监听0.0.0.0
Swagger时,它之前返回的身份名称现在也会遇到401。为什么会发生这种情况?
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://0.0.0.0:45789"
},
"Https": {
"Url": "https://0.0.0.0:45790"
}
}
}
型
1条答案
按热度按时间yb3bgrhw1#
如果您使用的是Edge,即使您使用Windows身份验证保护了WebAPI,您也可能不必输入Windows用户名和密码。因为Edge默认将Windows身份验证集成到本地网站。但如果您使用其他客户端或浏览器,如Chrome,Firefox,Postman,则不会发生这种情况。
要使Egde像其他客户端一样正常工作,您可以从Edge中选择“更多工具”->“Internet选项”->“安全”选项卡->本地Intranet”->”站点”->检查“自动检测Intranet网络
x1c 0d1x的数据
然后,当您从swagger访问API时,它将提示输入credential.