【C#】APIで401(Unauthorized)を返す方法

記事内に広告が含まれています。

C#でレスポンスをJSONで返すAPIを作っていたのですが、認証エラーの場合「401(Unauthorized)」を返さなければならず、調べてもパッと解決策が出なかったので、ここにメモしておきます。

スポンサーリンク

作成するAPIのコントローラー

テスト用として作成したコントローラーは以下の形

public class UpdateMemberController : ApiController
{
    public IHttpActionResult Post(MemberRequestModel param)
    {
        // 更新処理をする

        var response = new MemberResponseModel() { Message = "更新完了" };
        return Json(response);
    }
}

public class MemberResponseModel
{
    public string Message { get; set; }
}

正常応答の場合、Jsonの形でレスポンスを返すようにしています

とりあえず401(Unauthorized)を返すなら

とりあえず「401(Unauthorized)」を返すだけいいならば、「Unauthorized()」を使えば一発です

public class UpdateMemberController : ApiController
{
    public IHttpActionResult Post(MemberRequestModel param)
    {
        // 認証処理
        if(認証エラー)
        {
            return Unauthorized();
        }

        var response = new MemberResponseModel() { Message = "更新完了" };
        return Json(response);
    }
}

public class MemberResponseModel
{
    public string Message { get; set; }
}

これで認証エラーの場合はStatusを「401(Unauthorized)」で返すことができます

オブジェクトも一緒に返したい場合

上記の方法だとオブジェクトは何も返すことができません

独自でエラーステータスやメッセージを返したい場合は別の方法が必要になります

public class UpdateMemberController : ApiController
{
    public IHttpActionResult Post(MemberRequestModel param)
    {
        var response = Models.MemberResponseModel();

        // 認証処理
        if(認証エラー)
        {
            response.Message = "認証エラーです。";
            return Content(HttpStatusCode.Unauthorized, JObject.FromObject(response));
        }
        response.Message = "更新完了";
        return Json(response);
    }
}

public class MemberResponseModel
{
    public string Message { get; set; }
}

このような形でContentメソッドとJObject.FromObjectを使えば、「401(Unauthorized)」と一緒に独自で定義したオブジェクトをJsonの形で返すことができます

スポンサーリンク

まとめ

Jsonオブジェクトを含めた形で「401(Unauthorized)」を返すことができたのでとりあえず個人的には問題解決

別の方法も考える余裕があれば追加します

コメント