asp.net-core - Windows 身份验证失败并显示“401 Unauthorized”
问题描述
我有一个 MVC 客户端访问受 IDS4 保护的 Web API。它们都在我的本地机器上运行并由 IIS 托管。使用本地身份进行身份验证时,该应用程序运行良好。但是当我尝试使用 Windows 身份验证时,我不断从开发工具中收到“401 Unauthorized”错误,并且登录框不断返回浏览器。
这是 Windows 身份验证 IIS 设置
和启用的提供者
几乎就像用户 ID 或密码错误一样,但这几乎是不可能的,因为这是我一直用于登录系统的域用户 ID 和密码。此外,根据我的阅读,Windows 身份验证应该是“自动的”,这意味着我将在没有登录框的情况下进行静默身份验证。
更新
我启用了 IIS 请求跟踪,这是日志的结果:
从跟踪日志项 #29 中可以看出,身份验证(使用我输入的用户 ID,“DOM\Jack.Backer”)是成功的。然而,在那之后,一些授权项目(#48)失败了。这是失败项目的详细信息:
有趣的是,ErrorCode 表示操作(无论是什么)成功完成,但我仍然收到 HttpStatus=401 和 HttpReason=Unauthorized 的警告。显然,这就是我的 Windows 身份验证失败的原因。但是这个授权是关于什么的,我该如何解决呢?
解决方案
万一有人感兴趣-我终于想通了。这是因为我在 2020 年末从 IndentityServer4 的快速入门站点下载的代码没有 Windows 身份验证所需的一些重要部分。这是我必须添加到 ExternalController 类的 Challenge 函数中的内容
这是 ProcessWindowsLoginAsync 函数
private async Task<IActionResult> ProcessWindowsLoginAsync(string returnUrl)
{
var result = await HttpContext.AuthenticateAsync(AccountOptions.WindowsAuthenticationSchemeName);
if (result?.Principal is WindowsPrincipal wp)
{
var props = new AuthenticationProperties()
{
RedirectUri = Url.Action(nameof(Callback)),
Items =
{
{ "returnUrl", returnUrl },
{ "scheme", AccountOptions.WindowsAuthenticationSchemeName },
}
};
var id = new ClaimsIdentity(AccountOptions.WindowsAuthenticationSchemeName);
id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.Identity.Name));
id.AddClaim(new Claim(JwtClaimTypes.Name, wp.Identity.Name));
if (AccountOptions.IncludeWindowsGroups)
{
var wi = wp.Identity as WindowsIdentity;
var groups = wi.Groups.Translate(typeof(NTAccount));
var roles = groups.Select(x => new Claim(JwtClaimTypes.Role, x.Value));
id.AddClaims(roles);
}
await HttpContext.SignInAsync(IdentityConstants.ExternalScheme, new ClaimsPrincipal(id), props);
return Redirect(props.RedirectUri);
}
else
{
return Challenge(AccountOptions.WindowsAuthenticationSchemeName);
}
}
现在我的 Windows 身份验证工作没有问题。
推荐阅读
- ios - 如何在播放到 Apple TV 的 DRM 视频上添加文本覆盖?
- scala - 通过 libraryDependencies 添加依赖项与通过 sbt 插件添加依赖项有什么区别?
- postgresql - 如何将在 postgresql 中表示 HEX 八位字节的字符串转换为二进制?
- http - 通过慢速网络 http 上传大文件(可中断)
- spring-boot - Spring Boot 和 JWT - 未找到发布请求返回页面
- python - Opencv 错误 - 不支持的输入图像深度:
- html - Pug 中的条件语句
- azure - 我们可以使用 Bitbucket 数据中心在 Azure Devops / VSTS 中创建构建管道吗?
- java - 使用房间从两个表中获取一个对象中的两个列表
- c# - C# 控制台配置重命名和重定位