0

WebApi と IdentityServer の受け入れテストを作成したいと考えていました。できるだけ単純にするために、ここからサンプル プロジェクト全体をコピーしましたが、別のプロジェクトを追加しました。これにより、基本的にコンソール クライアントと同じですが、受け入れテストが行​​われます。

私が今得た唯一のシナリオはこれです:

namespace SpecTesting
{
using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using FluentAssertions;
using IdentityModel.Client;
using Xbehave;

public class JustLikeConsole
{
    private static readonly string ServerUrl = "http://localhost:11111";
    private static readonly string IdentityServerUrl = "http://localhost:5000";

    private IDisposable webApp;
    private IDisposable identityServer;
    private HttpClient appClient;
    private HttpClient identityServerClient;

    [Background]
    public void Background()
    {
        "establish server"._(() =>
        {
            this.identityServer = Microsoft.Owin.Hosting.WebApp.Start<IdSrv.Startup>(IdentityServerUrl);
            this.webApp = Microsoft.Owin.Hosting.WebApp.Start<Apis.Startup>(ServerUrl);
            this.appClient = new HttpClient { BaseAddress = new Uri(ServerUrl) };
            this.identityServerClient = new HttpClient { BaseAddress = new Uri(IdentityServerUrl) };
        }).Teardown(() =>
        {
            this.identityServerClient.Dispose();
            this.appClient.Dispose();
            this.webApp.Dispose();
            this.identityServer.Dispose();
        });
    }

    [Scenario]
    public void SimplestScenario(HttpResponseMessage response)
    {
        var clientId = "silicon";
        var clientSecret = "F621F470-9731-4A25-80EF-67A6F7C5F4B8";
        var expectedJson = $"{{ client: '{clientId}' }}";

        "get token"._(() =>
        {
            var client = new TokenClient(
                $"{IdentityServerUrl}/connect/token",
                clientId,
                clientSecret);

            var token = client.RequestClientCredentialsAsync("api1").Result;
            this.appClient.SetBearerToken(token.AccessToken);
        });

        "when calling the service"._(()
            => response = this.appClient.SendAsync(new HttpRequestMessage(HttpMethod.Get, "/test"), CancellationToken.None).Result);

        "it should return status code 'OK'"._(()
            => response.StatusCode.Should().Be(HttpStatusCode.OK));

        "it should equal expected json"._(()
            => response.Content.ReadAsStringAsync().Result.Should().Be(expectedJson));
    }
}
}

「ok」ではなく「unauthorized」というステータス コードが常に表示されるようになりました。コンソール クライアントを介して 2 つのサーバーを呼び出すと、期待どおりに動作します。とてもイライラします。

更新 「サービスを呼び出すとき」の手順を次の行に置き換えて、単純さを高めました。

var client = new HttpClient();
client.SetBearerToken(token.AccessToken);
var result = client.GetStringAsync($"{ServerUrl}/test").Result;

問題は同じです: HttpRequestException がスローされます (401 無許可)。

4

1 に答える 1

0

その間、私はそれが機能しなかった理由を見つけました:

WebApiでIdentityServer3.AccessTokenValidationのバージョン2.6.0以前を使用する必要があることが判明しました。2.7.0 以降にアップデートするとすぐに動作しなくなります。2 つのリリース間で正確に何が変更されたのか、したがって何が問題を引き起こしているのかを調べる時間はありませんでした。しかし、それを IdentityServer3.AccessTokenValidation に分離できました

于 2016-11-09T10:15:58.720 に答える