asp.net-core - ASOS - 当具有单独的授权服务器和资源服务器时, token 验证不起作用

标签 asp.net-core oauth-2.0 openid-connect aspnet-contrib

我正在尝试通过此 post 使用 ASOS 来实现 OpenID Connect 服务器(资源所有者密码凭据授予) . 当我在一个应用程序中同时拥有授权服务器和资源服务器时,一切正常。但是当我将它们拆分到两个应用程序(但在一台机器上)时,资源服务器无法验证 token 并返回访问 token 无效

我下载了 AspNet.Security.OAuth.Validation 的源代码来调查这个问题,它返回 null here

这是授权服务器的一些日志:


    info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
          Request starting HTTP/1.1 POST http://localhost:5000/connect/token application/x-www-form-urlencoded; charset=UTF-8 77
    info: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0]
          The token request was successfully extracted from the HTTP request: {
            "grant_type": "password",
            "username": "UserLogin",
            "password": "[removed for security reasons]",
            "scope": "offline_access"
          }.
    info: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0]
          The token request was successfully validated.
    trce: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0]
          A sign-in operation was triggered: sub: 123, username: UserLogin ; [.scopes, ["email","profile","offline_access"]], [.resources, ["resource_server"]].
    dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37]
          Reading data from file 'C:\Users\User1\AppData\Local\ASP.NET\DataProtection-Keys\key-********-****-****-****-64bb57db1c3b.xml'.
    dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[18]
          Found key {********-****-****-****-64bb57db1c3b}.
    dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[13]
          Considering key {********-****-****-****-64bb57db1c3b} with expiration date 2017-09-27 16:44:49Z as default key.
    dbug: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor[51]
          Decrypting secret element using Windows DPAPI.
    dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.CngCbcAuthenticatedEncryptorDescriptor[4]
          Opening CNG algorithm 'AES' from provider '(null)' with chaining mode CBC.
    dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.CngCbcAuthenticatedEncryptorDescriptor[3]
          Opening CNG algorithm 'SHA256' from provider '(null)' with HMAC.
    dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider[2]
          Using key {********-****-****-****-64bb57db1c3b} as the default key.
    trce: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector[31]
          Performing protect operation to key {********-****-****-****-64bb57db1c3b} with purposes ('C:\Users\User1\documents\visual studio 2017\Projects\OpenIdDictSample\Aka.OpenIdConnectServer', 'OpenIdConnectServerHandler', 'AccessTokenFormat', 'ASOS').
    trce: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0]
          A new access token was successfully generated using the specified data format: CfDJ8NSKICBGwihOm75ku1fbHDtG4usEbfF-mLGaJcGGFEPQJLb36rfHqCTJ3Clu_SCBRHlaZ_B7s3pxNfUqS9fPfjtjjEH1KKmkiV6gvakRYf0Iof32BVddUUPgd7sEDrB0fET91pIDJT9WwsPx653viw5tFyvrztsSD5CYAOQZjm1werRcVPuvwRhXUQb_9Vbba52tqj8y7WbOjk78Hl17knbwSz4C70vwlRU5pL_Bp41R4vEEKwtm_VMQ_u1kSBKM5KjOh6OKdbDJ9jOhyh4RpNbvGN25ZskzByi8ndKRW3dmajWYyf-0cj6-4MEE5Hocd47te8C-haYIxEUb7tcQ-JTItknIiE1sk6W7zHlhLg3nprE2Ct4mvKi11G7Kvd1W4u-UmEvL1NesjVFNKpNJVdEaK2I8mcNzJLU69ZnM4poRrLqEqD__cHa8nCFgPtE9L0Jyo6IyFwc7NZ2sXz7y7lPfJ9Q3Pu1W_t0lOGBte5uKHfJZpiOYaqKrAwdJSpULLK52iKoCNhRYxOSdq__DNJs ; sub: 123, username: UserLogin ; [.scopes, ["email","profile","offline_access"]], [.resources, ["resource_server"]], [.issued, Fri, 30 Jun 2017 09:13:29 GMT], [.expires, Fri, 30 Jun 2017 10:13:29 GMT], [.token_id, e27cbb46-d1ea-4576-8803-dddc001b3fc8], [.audiences, ["resource_server"]].
    trce: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector[31]
          Performing protect operation to key {********-****-****-****-64bb57db1c3b} with purposes ('C:\Users\User1\documents\visual studio 2017\Projects\OpenIdDictSample\Aka.OpenIdConnectServer', 'OpenIdConnectServerHandler', 'RefreshTokenFormat', 'ASOS').
    trce: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0]
          A new refresh token was successfully generated using the specified data format: CfDJ8NSKICBGwihOm75ku1fbHDtcKlYz_IbJiNmiW_tfu19E7p5BIO9xE0b2qu8mYWw-zD7wCWB1F5Fx548L4FARrsJwlJls1AkK2GrqXjV0krH6me_btsSAxM9trrFCUL2ZrXkm2sStZ6DUcbf_cSNFh-YxXft-gbLGV11THAINTb8K9-v_fkeXq7aN8Qgu7zJfhON1ehflLwZ-DXZwW_S9assqx8f7oe-n5gTzOO6PjEyO5g0YMJ1SY7X-sMO1MKjn03vZxPB0ecT0l8NXB89vGhW7kZnoEaL1NwmSTiEOYMatwrkURPBgb2YLnpiu7sYAD04HxsicoLaQTDbc8ZJyWUJ7guLl6Mp2HLhZG_wLQM9REC_QeZX8eDn8aqSOiGKZeLF4G7A5y369VIZ0RPASdTpEsAHSE8ws0RB18jap-75bM_aAi3w3-PlfnY7ySnDYm3xkF1ImyBcph2XF6R8-imdAXhQG-tTAYd2FKw4msaWCPcnX5CxYlo-alVYpd878haDvo43fCvbd2_Dc2O1wI98 ; sub: 123, username: UserLogin ; [.scopes, ["email","profile","offline_access"]], [.resources, ["resource_server"]], [.issued, Fri, 30 Jun 2017 09:13:29 GMT], [.expires, Fri, 14 Jul 2017 09:13:29 GMT], [.token_id, c0cf40ad-cd47-4c82-9e37-6943cda95ffc].
    info: AspNet.Security.OpenIdConnect.Server.OpenIdConnectServerMiddleware[0]
          The token response was successfully returned: {
            "resource": "resource_server",
            "scope": "email profile offline_access",
            "token_type": "Bearer",
            "access_token": "[removed for security reasons]",
            "expires_in": 3600,
            "refresh_token": "[removed for security reasons]"
          }.

这是资源服务器的一些日志:


    info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
          Request starting HTTP/1.1 GET http://localhost:5001/api/values
    trce: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector[5]
          Performing unprotect operation to key {********-****-****-****-64bb57db1c3b} with purposes ('C:\Users\User1\documents\visual studio 2017\Projects\OpenIdDictSample\Aka.WebApi', 'OpenIdConnectServerHandler', 'AccessTokenFormat', 'ASOS').
    dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37]
          Reading data from file 'C:\Users\User1\AppData\Local\ASP.NET\DataProtection-Keys\key-********-****-****-****-64bb57db1c3b.xml'.
    dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[18]
          Found key {********-****-****-****-64bb57db1c3b}.
    dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[13]
          Considering key {********-****-****-****-64bb57db1c3b} with expiration date 2017-09-27 16:44:49Z as default key.
    dbug: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor[51]
          Decrypting secret element using Windows DPAPI.
    dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.CngCbcAuthenticatedEncryptorDescriptor[4]
          Opening CNG algorithm 'AES' from provider '(null)' with chaining mode CBC.
    dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.CngCbcAuthenticatedEncryptorDescriptor[3]
          Opening CNG algorithm 'SHA256' from provider '(null)' with HMAC.
    dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider[2]
          Using key {********-****-****-****-64bb57db1c3b} as the default key.
    info: AspNet.Security.OAuth.Validation.OAuthValidationMiddleware[7]
          Bearer was not authenticated. Failure message: Authentication failed because the access token was invalid.

1) 我的资源服务器出了什么问题?

2)如何在不同的机器上配置资源服务器(特别是 token 签名/检查和加密/解密)?

最佳答案

How to configure the resource server on different machine (especially token signing/checking and encryption/decryption)?

您需要确保 key 环(包含由 ASP.NET Core 数据保护派生以创建加密和验证 key 的主 key )正确同步并由您的授权服务器和资源服务器共享.此处描述了该过程:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview .

这是一个如何使用共享文件夹完成的示例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
}

您还需要配置这两个应用程序以使用相同的“应用程序鉴别器”:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .SetApplicationName("Your application name");
}

关于asp.net-core - ASOS - 当具有单独的授权服务器和资源服务器时, token 验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44844139/

相关文章:

spring - 在 Spring Security 5 OAuth 客户端和 Spring Boot 2.0 中,authorizationGrantType 不能为 null

c# - Asp.net Core 中 IFormFile 字段的 xunit 测试

asp.net-core - 新的 .NET "project.json"项目,将预构建的 native .dll 复制到输出目录

c# - 使用本地帐户使用安全的 ASP Net 5 web api

rsa - 验证 JWT.IO 中的签名

java - 如何使用带有 Spring Security 5.1+ 的谷歌 OIDC 对用户进行身份验证

c# - 调试 IIS 网站时,ASP.NET Core 2 Web 应用程序未加载用户 secret

c# - 使用 OpenIdConnectServer 并尝试通过 API 服务连接到 Facebook

android - 401 Unauthorized error.将授权码升级为凭证对象失败

angularjs - 在 Angular 应用程序中将 http header 添加到 window.location.href