我在.net Core 2.0上运行资源所有者密码授予类型的Identity Server通过以下内存客户端:
new Client
{
ClientId = "myclient",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
AllowOfflineAccess = true,
ClientSecrets = {new Secret("AAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE".Sha256())},
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.OfflineAccess,
"spa"
}
}
然后我通过Core的身份验证将其与JWT令牌联系起来:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
});
对于IdentityServer:
services.AddAuthentication()
.AddIdentityServerAuthentication(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = serverUrl;
options.RequireHttpsMetadata = false;
options.ApiName = "spa";
});
这很好用,但我想在{1}}中按照IdentityServer快速入门添加Windows Auth。
然后Login()
方法检查自定义视图模型是否正在使用SSO(先前根据返回URL确定),并选择使用ExternalLogin()
或默认资源所有者视图。这样可以正常工作,用户凭据和Windows身份验证登录都会成功,Windows Auth会将访问令牌提供给客户端。然后使用这些访问令来访问资源。
当将无效的承载访问令牌发送回服务器(到期或手动操作)时,问题就出现了。此请求失败,服务器发出401 Unauthorized
响应。
通常情况下这是可以的,因为WWW-Authenticate
标头将设置为Bearer
以及可以在客户端处理的一些错误信息。但是,如果在IIS中启用了Windows身份验证,则此标头将返回为:
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
这反过来导致浏览器弹出标准凭据输入框,并且无法在前端捕获。
我和其他人无法找到这些标头的发布位置,因为它们是在未选择Windows Auth的情况下发生的。我最好的猜测是,在IdentityServer的黑匣子中,它拒绝无效访问令牌,服务器假设Windows Auth失败并需要重新尝试。为什么这些标题会一直到浏览器,我不确定。
在代码中划分各种元素不会产生任何结果;所有内容都没有被点击,因为它超出了身份验证,或者在浏览器显示凭据条目后被点击。
有没有人知道这是从哪里来的,以及我如何能够驯服它?