【问题标题】:IdentityServer3 xBehave testIdentityServer3 xBehave 测试
【发布时间】:2016-11-07 10:21:30
【问题描述】:

我想为我的 WebApi 和 IdentityServer 编写验收测试。为了让事情尽可能简单,我从here 复制了整个示例项目,但添加了另一个项目,它与控制台客户端基本相同,只是作为验收测试。

我现在得到的唯一场景是:

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));
    }
}
}

我现在总是得到状态代码“未授权”而不是“正常”。当我通过控制台客户端调用两台服务器时,它按预期工作。非常沮丧。

更新 我用以下几行替换了“调用服务时”步骤,只是为了简化:

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

问题还是一样:现在抛出 HttpRequestException(401 未授权)。

【问题讨论】:

  • 这个问题是后续的:stackoverflow.com/questions/40425587/…
  • 下面“get token”的场景,是不是appClient上没有设置token那么简单? cp 将获取的令牌粘贴到每个场景中,然后验证它不是这样
  • 没用。我已经更新了问题

标签: asp.net identityserver3 xunit atdd


【解决方案1】:

与此同时,我找到了它不起作用的原因:

原来我必须在 WebApi 上使用 IdentityServer3.AccessTokenValidation 的 2.6.0 版或更早版本。一旦我更新到 2.7.0 或更高版本,它就会停止工作。我没有时间找出这两个版本之间究竟发生了什么变化以及导致问题的原因。但我可以将其隔离到 IdentityServer3.AccessTokenValidation

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多