首页 文章

IdentityServer4具有集成的Windows身份验证

提问于
浏览
1

我是相当新的IdentityServer4,我正在尝试为不同的内部API配置访问控制 . 通过内部我的意思是它不是在互联网上 . 我选择了IdentityServer4,因为它对于不同的客户端和授权类型似乎具有很大的灵活性 .

现在我正试图让Windows身份验证(针对AD)工作 . 首先让我告诉你我希望它如何工作,然后我会告诉你我尝试过的东西 .

登录到AD的任何用户都应该能够从令牌 endpoints 请求令牌 . 因此,对于具有集成Windows身份验证的任何应用程

以下是我希望如何在PowerShell中工作的示例 . 我不确定身体究竟应该是什么样子,但你希望得到重点 .

$cred = Get-Credential
$body = @{grant_type='client_credentials';client_id='client'}
Invoke-RestMethod http://localhost:5000/connect/token -Method POST -Credential $cred -Body $body

所以我研究了IdentityServer4的Quickstart示例,并阅读了Windows Authentication上的文档 . 我拿了simplest quickstart example并尝试修改它以使用Windows身份验证 .

该示例使用 WebHost.CreateDefaultBuilder 作为服务器,这意味着应该自动配置Kestrel(根据文档) . 然后我相应地修改 ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients());

    services.Configure<IISOptions>(iis =>
    {
        iis.AuthenticationDisplayName = "Windows";
        iis.AutomaticAuthentication = false;
    });
}

并在 launchSettings.json 我设置

iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5000/",
      "sslPort": 0
    }
  }

但是,这不起作用 . 当我运行服务器并尝试使用上述PowerShell脚本请求令牌时,我从IdentityServer获取以下错误日志:

[10:24:56 Debug] IdentityServer4.Validation.ClientSecretValidator
Start client validation

[10:24:56 Debug] IdentityServer4.Validation.BasicAuthenticationSecretParser
Start parsing Basic Authentication secret

[10:24:56 Debug] IdentityServer4.Validation.PostBodySecretParser
Start parsing for secret in post body

[10:24:56 Debug] IdentityServer4.Validation.PostBodySecretParser
client id without secret found

[10:24:56 Debug] IdentityServer4.Validation.SecretParser
Parser found secret: PostBodySecretParser

[10:24:56 Debug] IdentityServer4.Validation.SecretParser
Secret id found: client

[10:24:56 Debug] IdentityServer4.Validation.HashedSharedSecretValidator
Hashed shared secret validator cannot process NoSecret

[10:24:56 Debug] IdentityServer4.Validation.SecretValidator
Secret validators could not validate secret

[10:24:56 Error] IdentityServer4.Validation.ClientSecretValidator
Client secret validation failed for client: client.

[10:24:56 Verbose] IdentityServer4.Hosting.IdentityServerMiddleware
Invoking result: IdentityServer4.Endpoints.Results.TokenErrorResult

我觉得有点无能,就像我在这里遗漏了一些东西(比如正确设置客户端?) . 我非常感谢这里的任何帮助!

1 回答

  • 0

    日志说它 - 你错过了客户的秘密 .

    但是你在这里有一个更大的缺失 . 您正在尝试使用client credentials grant类型 . 根据我从您的解释中理解,您想要与当前的Windows用户进行身份验证,我是对的吗?

    如果是这样 - 你的方法是错的 . 客户端凭据授予类型用于客户端(了解应用程序)身份验证 . 换句话说 - 它将验证应用程序本身(无论是你的powershell脚本,控制台应用程序还是其他任何东西),而不是正在使用它的用户 .

    例如,如果我们(我和你)在不同的机器上执行相同的脚本,在不同的用户凭据下,我们仍将在访问令牌中收到相同的声明,因为我们被认证为客户端 .

    查看token endpoint文档以获取更多选项 .

    如果要根据用户和密码获取令牌,则需要使用密码授予类型 .

    希望这有助于并为您提供一些线索 .

相关问题