0

ユーザー名とパスワードを認証した後、トークンを発行する OAuthServerProvider があります。ユーザー名またはパスワードが無効な場合、owin Context を拒否します。これは、デフォルト400 Bad Requestでステータス コードとして返されます。

しかし、私は401 Unauthorized

これを実現するために、ヘッダーをチェックしてカスタム ヘッダーが存在するかどうかを確認し、存在する場合はステータス コードを 401 に置き換えるミドルウェアを作成しました。

if (context.Response.StatusCode == 400 && context.Response.Headers.ContainsKey(Constants.OwinChallengeFlag))
{
   var headerValues = context.Response.Headers.GetValues(Constants.OwinChallengeFlag);
   context.Response.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault());
   context.Response.Headers.Remove(Constants.OwinChallengeFlag);
}

これは、フィドラーでヒットするとまったく問題なく動作しますが、以下に記述した単体テストは常に 400 を取得します。どういうわけか、単体テストでリクエストを行うと、ミドルウェアがスキップされます。

[TestFixture]
public class UnitTest1
{
    private TestServer _server;

    [SetUp]
    public void SetUp()
    {
        _server = TestServer.Create<Startup>();
    }

    [Test]
    public void ShouldReturnUnauthorizedResponse()
    {

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "/token");

        //wrong password 
        var requestContent = "grant_type=password&UserName=foo&Password=bar";

        request.Content = new StringContent(requestContent, Encoding.UTF8, "application/x-www-form-urlencoded");

        var response = _server.HttpClient.SendAsync(request).Result;

        //This assert fails, but shouldn't
        Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized));
    }
}

ここで私が間違っていることを知る必要があります。

4

1 に答える 1