IdentityServer无效令牌会导致Windows Auth NTLM 401响应不正确

时间:2018-03-26 17:18:43

标签: c# asp.net oauth-2.0 windows-authentication identityserver4

我在.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失败并需要重新尝试。为什么这些标题会一直到浏览器,我不确定。

在代码中划分各种元素不会产生任何结果;所有内容都没有被点击,因为它超出了身份验证,或者在浏览器显示凭据条目后被点击。

有没有人知道这是从哪里来的,以及我如何能够驯服它?

0 个答案:

没有答案