ユーザー名とパスワードを認証した後、トークンを発行する 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));
}
}
ここで私が間違っていることを知る必要があります。