2016-03-14 2 views
2

Я пытаюсь установить собственное сообщение об ошибке, чтобы вернуться из кода «ValidateIdentity» из моего OAuthBearerAuthenticationProvider. Но все это я получаю обратноНевозможно перезаписать тело ответа с помощью пользовательского сообщения в ValidateIdentity в OAuthBearerAuthenticationProvider class

{"message":"Authorization has been denied for this request."} 

Это мой код:

internal class CustomOAuthBearerAuthenticationProvider : OAuthBearerAuthenticationProvider 
{ 
    public override async Task ValidateIdentity(OAuthValidateIdentityContext context) 
    { 
     context.SetError("unauthorized_client", "more infos follow"); 

     return; 
    } 
} 


... 

var oauthbearer = new OAuthBearerAuthenticationOptions 
{ 
    Provider = new CustomOAuthBearerAuthenticationProvider(), 


}; 

appBuilder.UseOAuthBearerAuthentication(oauthbearer); 

Есть ли возможность переписать стандартную ошибку?

+0

Я тоже хотел бы знать ответ на этот вопрос. –

ответ

0

Я смотрю исходный код Microsoft.Owin.Security.Jwt, нахожу, что он не обрабатывает ответ . Вы можете сделать это таким образом.

public class TokenAuthorizeAttribute: AuthorizeAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     base.OnAuthorization(actionContext); 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     //Write Your Response Body ,Now I Throw a Custom ValidateException; 
     throw new TokenValidateException(); 
     //base.HandleUnauthorizedRequest(actionContext); 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     return base.IsAuthorized(actionContext); 
    } 
} 

другой способ

1.Add Расширение

public static class AppBuilderExtensions 
    { 
     /// <summary> 
     /// Jwt Authentication Extension 
     /// </summary> 
     /// <param name="app"></param> 
     /// <param name="options"></param> 
     public static void UseJwtAuthentication(this IAppBuilder app, JwtBearerAuthenticationOptions options) 
     { 
      app.UseJwtBearerAuthentication(options); 
      app.Use<JwtToken>(); 
     } 
    } 

2.make Middleware

using Microsoft.Owin; 
    using System.Security.Principal; 
    using System.Threading; 
    using AppFunc = Func<IDictionary<string, object>, Task>; 
    /// <summary> 
    /// 访问授权验证 
    /// </summary> 
    public class JwtToken 
    { 
     AppFunc _NextFunc; 

     public JwtToken(AppFunc headerAuthentication) 
     { 
      _NextFunc = headerAuthentication; 
     } 


     public async Task Invoke(IDictionary<string, object> environment) 
     { 
      IOwinContext context = new OwinContext(environment); 

      if (AuthorizeCore(context)) 
      { 
       await _NextFunc.Invoke(environment); 
      }else{ 
       IOwinResponse response = context.Response; 
       response.StatusCode = 401; 
       response.ContentType = "application/json; charset=utf-8"; 
       response.Write(string.Format("{{\"ErrCode\": 0,\"ErrMsg\": null,\"SubErrCode\": {0},\"SubErrMsg\": \"\"}}", 
       HandlerErrorStatusCode.SystemParamsValidateException)); 
      } 
     } 

     ///Check Token IsAuthenticated 
     private bool AuthorizeCore(IOwinContext httpContext) 
     { 
      if (httpContext == null) 
      { 
       throw new ArgumentNullException("httpContext"); 
      } 

      IPrincipal user = httpContext.Authentication.User; 
      if (user == null || !user.Identity.IsAuthenticated) 
      { 
       return false; 
      } 

      return true; 
     } 

     /// <summary> 
     /// 资源的释放 
     /// </summary> 
     public void Dispose() { } 
    } 
+0

Я боюсь, что это уже слишком поздно для меня. Это должно произойти в рамках авторизации. – rudimenter

+0

Я редактирую свой ответ, вижу, может ли это удовлетворить ваши потребности, извините, мой английский не очень хорошо – Nothing