2

J'ai un filtre d'authentification dans mon contrôleurEnvoi d'une réponse json à l'aide du filtre d'authentification dans le contrôleur Web API?

[ArcGISAuthentication] 

J'ai défini le filtre comme ci-dessous

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() 
    { 

    } 
} 

Le problème est que je veux envoyer un repsonse JSON lorsque l'authentification échouent. Comme dans l'instruction else dans AuthenticateAsync ci-dessus.

Comment est-ce que je peux faire ceci?

+0

Créez un résultat d'erreur personnalisé et définissez-le sur la propriété 'context.Error'. Dans le résultat, vous pouvez définir le message de réponse à JSON ou laisser le négociateur de contenu déterminer quel type de média à renvoyer en fonction des en-têtes de requête – Nkosi

Répondre

3

Créer un résultat d'erreur personnalisé

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

et le mettre à la context.Error propriété

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

Dans le Execute du résultat que vous pouvez définir le message de réponse à JSON ou laisser le négociateur de contenu déterminer quel type de média renvoyer en fonction des en-têtes de demande.