在ASP.Net Web API中使用IdentityServer3.AccessTokenValidation与IDS4对话

时间:2018-11-25 07:21:29

标签: asp.net-core asp.net-web-api2 identityserver4 identityserver3

我们已使用.Net Core 2.1设置了身份服务器4。我们在.Net 4.6上有ASP.Net Web API。无法将其迁移到Core。我已经在该API项目中安装了IdentityServer3.AccessTokenValidation以及OWN和其他需要的软件包。我可以使用客户端,并从IdentityServer获取访问令牌。当客户端通过API使用该令牌时,我得到401。我在网上搜索了解决方案,但找不到任何可用于完成此工作的内容。 我尝试过-https://github.com/IdentityServer/IdentityServer3.AccessTokenValidation/issues/164 但没有用。我找不到任何样品。 所以我的问题是,是否不可能使用IdentityServer3.AccessTokenValidation与IDS4对话?

我是否需要设置IDS3?

更新

我打开了详细日志记录,并得到了以下内容

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:44333/connect/introspect application/x-www-form-urlencoded 70
IdentityServer4.Hosting.IdentityServerMiddleware:Information: Invoking IdentityServer endpoint: IdentityServer4.Endpoints.IntrospectionEndpoint for /connect/introspect
IdentityServer4.Validation.ApiSecretValidator:Error: API validation failed.
IdentityServer4.Endpoints.IntrospectionEndpoint:Error: API unauthorized to call introspection endpoint. aborting.
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 26.5186ms 401 
Microsoft.AspNetCore.Server.Kestrel:Information: Connection id "0HLIJ2C0UKBLN", Request id "0HLIJ2C0UKBLN:00000008": the application completed without reading the entire request body.

下面是我在Configuration方法中的API代码

        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "https://localhost:44333",
            RequiredScopes = new[] { "api" },

            ClientId = "api",
            ClientSecret = "secret",

            //DelayLoadMetadata = true
        });

        app.UseWebApi(config);

ApiResource的IDS4一侧的代码。

    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("api", "MyApi") { ApiSecrets = { new Secret("secret".Sha256()) } }
        };
    }

更新2

是,我已启用跟踪。在更多地使用代码并重新安装软件包之后,我现在遇到了另一个错误。对/ connect / accesstokenvalidation发出了请求。该端点在IDS4中不可用

Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1 POST http://localhost:44333/connect/accesstokenvalidation application / x-www-form-urlencoded 70 Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在3.405毫秒内完成404 Microsoft.AspNetCore.Server.Kestrel:信息:连接ID为“ 0HLIJ9RBG591K”,请求ID为“ 0HLIJ9RBG591K:0000000A”:应用程序已完成,没有读取整个请求正文。

2 个答案:

答案 0 :(得分:0)

好,最后我在头痛3天后就解决了。

connect / accesstokenvalidation是由于IdentityServer3.AccessTokenValidation的旧版本所致。我将其更新到版本2.15.1,并且下装了 System.IdentityModel.Tokens.Jwt至4.0.2.206221351

我还向ApiResource添加了作用域,如下所示。但是,这可能不是必需的。没有它,我还没有测试。

    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("my_api", "SmartBiz Api")
            {
                ApiSecrets = { new Secret("secret".Sha256()) },
                Scopes =
                {
                    new Scope("the_api")
                }
            }
        };
    }

感谢您的帮助Rosdi Kasim

答案 1 :(得分:0)

我花了几天时间来解决一个问题,所以我想我会在我的发现中添加一个答案。我使用的是 IDS4 和 .net 4.7 web api。

验证客户端“API”(即 .net 4.7 应用程序)时的主要痛点,使用 IdentityServer4 dotnet 核心令牌服务器进行身份验证。问题是这样的。

.net 4.7 Web API Project的Startup.cs中设置的ClientID和ClientSecret就是API资源的ID和Secret。

首先,您点击 IDS4 /token 端点以获取令牌。该请求需要在 IDS4 项目的 Config.cs 文件中设置 client_id 和 client_secret(以及其他必需的值)。

  public static IEnumerable<ApiResource> Apis =>
        new ApiResource[]
        {
            new ApiResource("api", "My DotNet 4.7 API"){ //.net 4.7 API clientId
                ApiSecrets = new List<Secret>()
                {
                    new Secret("secret".Sha256())      //.net 4.7 API client secret
                },
                Scopes = { "api"}
            }
        };

       public static IEnumerable<Client> Clients =>
        new Client[]
        {
           new Client
            {
                ClientId = "client",

              ...

                // secret for authentication
                ClientSecrets =
                {
                    new Secret("secret1".Sha256())
                },

              ...
            }
        };

现在使用该令牌,您可以将其传递给 .net 4.7 Api 端点。这是我收到“401 UnAuthorized”的地方。解决方案在“启动”文件中,特别是这部分:

       app.UseIdentityServerBearerTokenAuthentication(
            new IdentityServerBearerTokenAuthenticationOptions
            {
                .....
                
                //this is the API Resource Id and Secret for that API resource
                ClientSecret = "secret",
                ClientId = "api"
            });

出于某种原因,我不清楚我必须在 API 的配置中使用 API 资源值。现在说得通。但出于某种原因,我准备的所有资源都没有明确指出这一点。