2017-08-07 9 views
1

私は私のウェブアピ.NETプロジェクトのためのトークンを使用した認証方法に取り組んでいますので、私はこのようないくつかのメソッドをオーバーライドしています:Web Api .NetのAuthorizeAttributeからPOSTパラメータを取得する方法

public class Authorizetest: System.Web.Http.AuthorizeAttribute 
{ 
     public override void OnAuthorization(HttpActionContext actionContext) 
    { 
      if(Authorize(actionContext)) 
     { 
      return; 
     } 
     HandleUnauthorizedRequest(actionContext); 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     base.HandleUnauthorizedRequest(actionContext); 
    } 

    private bool Authorize(HttpActionContext actionContext) 
    {   
     try 
     {       
      var context = new HttpContextWrapper(HttpContext.Current); 
      HttpRequestBase request = context.Request;    
      string token = request.Params["Token"]; 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
} 

私はこのようにデコレータ[Authorizetest]を使用しています:

[Authorizetest] 
    public class DoActionController : ApiController 
     { 
      [HttpPost] 
      public Display DoSomething(Parameter param) 
      { 
       //do something 
       return display; 
      } 
    } 

request.Paramsnullですが、DoSomethingの方法ではParameterの値が得られます。

私はまた、のようなものを試してみました:(this pageに基づく)

HttpRequestBase request = actionContext.RequestContext.HttpContext.Request; 
    string token = request.Params["Token"]; 

をしますが、POSTメソッドを介して送信された値を取得することはできません。

私は

$.ajax({ 
       type: 'POST', 
       url: '/DoSomething', 
       data: JSON.stringify({ "Token": "xxxxxxxxx"}), 
       contentType: 'application/json; charset=utf-8', 
       success: function (data) { 
       }, 
       fail:function (XMLHttpRequest, textStatus, errorThrown) { 
        alert(errorThrown); 
       } 
      }); 

がどのように私はAuthorizetest classDoSomethingに送信されたデータを取得することができ、データを送信するためのjQueryを使用していますか?

+0

でそれにアクセスします。それはあまり明確ではありません。 – Difster

+0

@Difster、ありがとう、私は少し質問を変更しました。私はそれがより明確であることを願っています – Jamo

+0

あなたはすでに送信されているデータを持っています。なぜあなたはすでに送信したものを取得する必要がありますか?あなたの 'data'変数にあります。 – Difster

答えて

1

認証トークンは要求のヘッダーで送信され、認可に使用することが意図されている場合は、認証属性によって抽出されます。モデルのバインダーの前にリクエストボディを読み込むと、モデルを埋め込むことができ、マイナスの影響を受ける可能性があります。

var token = "xxxxxxxxx"; 
$.ajax({  
    type: 'POST', 
    url: '/DoSomething', 
    data: JSON.stringify({ "SomeProperty": "SomeValue"}), 
    contentType: 'application/json; charset=utf-8', 
    beforeSend: function (xhr) { 
     /* Authorization header */ 
     xhr.setRequestHeader("Authorization", "Token " + token);   
    }, 
    success: function (data) { 
    }, 
    fail:function (XMLHttpRequest, textStatus, errorThrown) { 
     alert(errorThrown); 
    } 
}); 

その後、私はあなたがあなたの質問を言い換えるする必要があると思うサーバー

public class Authorizetest : System.Web.Http.AuthorizeAttribute { 
    public override void OnAuthorization(HttpActionContext actionContext) { 
     if (Authorize(actionContext)) { 
      return; 
     } 
     HandleUnauthorizedRequest(actionContext); 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) { 
     base.HandleUnauthorizedRequest(actionContext); 
    } 

    private bool Authorize(HttpActionContext actionContext) { 
     try { 
      var auth = actionContext.Request.Headers.Authorization; 
      if (auth != null) { 
       var scheme = auth.Scheme; //Should be Token, otherwise fail 
       var token = auth.Parameter; 
       //Validate your token and set your principal 
       IPrincipal user = GetUser(token); 
       if (user != null) { 
        SetPrincipal(user); 
        return true; 
       } 
      } 
      return false; 
     } catch (Exception) { 
      return false; 
     } 
    } 

    private IPrincipal GetUser(string token) { 
     throw new NotImplementedException(); //Put your implementation here 
    } 

    private void SetPrincipal(System.Security.Principal.IPrincipal principal) { 
     if (principal != null) { 
      System.Threading.Thread.CurrentPrincipal = principal; 
      if (System.Web.HttpContext.Current != null) { 
       System.Web.HttpContext.Current.User = principal; 
      } 
     } 
    } 
} 
+0

ありがとう!それは私が探していたものです! +1! – Jamo

関連する問題