2

私はこの問題は、私は、認証が失敗したときのJSON repsonseを送りたいですWeb APIコントローラで認証フィルタを使用してjson応答を送信していますか?

public class ArcGISAuthenticationAttribute : Attribute, IAuthenticationFilter 
{ 
    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     return Task.Run(async() => 
     { 
      var queryParameters = HttpUtility.ParseQueryString(context.Request.RequestUri.Query); 
      var token = queryParameters["token"]; 
      if (!string.IsNullOrWhiteSpace(token)) 
      { 
       var userInfo = await CommunityManager.GetUserInfoAsync(token); 
       context.Principal = new ArcGISUserPrincipal(userInfo, token); 
       context.Request.SetUserPrincipal(context.Principal); 
      } 
      else{ 
       //What shoudld I do here to send a json response 
      } 
     }); 
    } 

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) 
    { 
     return Task.Run(() => { }); 
    } 

    public ArcGISAuthenticationAttribute() 
    { 

    } 
} 

以下のように私は、フィルタを定義している私のコントローラで

[ArcGISAuthentication] 

を認証フィルタを持っています。上のAuthenticateAsyncのelseステートメントの場合と同じです。

どうすればいいですか?

+0

カスタムエラー結果を作成し、それを 'context.Error'プロパティに設定します。結果として、応答メッセージをJSONに設定するか、コンテンツネゴシエーターが要求ヘッダーに基づいて返すメディアタイプを決定させることができます – Nkosi

答えて

3

カスタムエラー結果

public class ErrorResult : IHttpActionResult { 
    public ErrorResult(HttpRequestMessage request, string message, HttpStatusCode status = HttpStatusCode.InternalServerError, string reasonPhrase = "Internal Server Error") { 
     ReasonPhrase = reasonPhrase; 
     Request = request; 
     Message = message; 
     Status = status; 
    } 

    public HttpStatusCode Status { get; private set; } 

    public string ReasonPhrase { get; private set; } 

    public string Message { get; private set; } 

    public HttpRequestMessage Request { get; private set; } 

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { 
     return Task.FromResult(Execute()); 
    } 

    private HttpResponseMessage Execute() { 
     var status = Status; 
     var responseBody = new Models.envelope { 
      meta = new Models.metadata { 
       code = (int)status, 
       type = ReasonPhrase ?? status.ToString().ToCamelCase(), 
       message = Message 
      }, 
      data = null 
     }; 
     var response = Request.CreateResponse(status, responseBody); 
     response.RequestMessage = Request; 
     response.ReasonPhrase = ReasonPhrase; 
     return response; 
    } 
} 

を作成し、JSONに応答メッセージを設定したり、コンテンツの交渉を決定させることができ、結果のExecutecontext.Errorプロパティ

if (!string.IsNullOrWhiteSpace(token)) 
{ 
    var userInfo = await CommunityManager.GetUserInfoAsync(token); 
    context.Principal = new ArcGISUserPrincipal(userInfo, token); 
    context.Request.SetUserPrincipal(context.Principal); 
} 
else 
{ 
    context.Error = new ErrorResult(context.Request, "Some message to return"); 
} 

に設定要求ヘッダーに基づいて返すメディアタイプ。

関連する問題