2016-12-21 23 views
0

MVP 4でWebポストWebHook呼び出しを処理するWebhookハンドラを作成する。私はそれがすべて働いているが、今いくつかの認証を追加したい。mvcコントローラでWebHook呼び出しを認証するhttp:// secretkey:[email protected]

Easypostは、WebHookハンドラのURLにユーザ名または秘密鍵を含める方法を提案しています(https://username:[email protected]/easypost-webhookreference)。それから私はその秘密鍵の値を抽出し、期待値と比較することを想定します。私は正規表現を介してこれをしようとしています。

問題は、コントローラのURLのusername:[email protected]部分を取得する方法が見つからないということです。 Request.RawUrlを試して、要求オブジェクト内のすべてのデータを検索しましたが、無駄です。

マイコード:

public class ParcelShippingWebHooksController : Controller 
{ 
    [ValidateInput(false)] 
    [HttpPost] 
    public ActionResult ParcelTrackingWebHookHandler() 
    { 
     //Authenticate request 
     string key = AppSettings.ParcelTrackingWebhookSecretKey; 
     string url = Request.RawUrl; <---- how get raw url 
     string strPattern = @"secretkey:(.*)\@"; 
     Match match = Regex.Match(url, strPattern); 
     if(!match.Success) return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
     if(match.Value != key) return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 

     //Convert request to string 
     byte[] param = Request.BinaryRead(Request.ContentLength); 
     string strWebHookDataRequest = Encoding.ASCII.GetString(param); 

     //perform tracking updates 
     var webhookAppServ = new ParcelShippingWebHooksAppServ(new InventoryMgmtContext()); 
     var updateTrackingResult = webhookAppServ.UpdateParcelTrackingStatusFromWebHook(strWebHookDataRequest); 

     if (updateTrackingResult.WasSuccessful) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.OK); // OK = 200 
     } 
     else 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); 
     } 
    } 
} 

答えて

1

あなたが参照しているEasypostリファレンスを使用すると、基本認証+ SSLを使用することを示唆しています。

この認証を確認するには、MVCを設定する必要があります。

BasicAuthenticationAttribute

 public class BasicAuthenticationAttribute : ActionFilterAttribute 
     { 
      public string BasicRealm { get; set; } 
      protected string Username { get; set; } 
      protected string Password { get; set; } 

      public BasicAuthenticationAttribute(string username, string password) 
      { 
       this.Username = username; 
       this.Password = password; 
      } 

      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       var req = filterContext.HttpContext.Request; 
       var auth = req.Headers["Authorization"]; 
       if (!String.IsNullOrEmpty(auth)) 
       { 
        var cred = System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':'); 
        var user = new { Name = cred[0], Pass = cred[1] }; 
        if (user.Name == Username && user.Pass == Password) return; 
       } 
       filterContext.HttpContext.Response.AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", BasicRealm ?? "Ryadel")); 
       /// thanks to eismanpat for this line: http://www.ryadel.com/en/http-basic-authentication-asp-net-mvc-using-custom-actionfilter/#comment-2507605761 
       filterContext.Result = new HttpUnauthorizedResult(); 
      } 
     } 

サンプルのcontroler

[BasicAuthenticationAttribute("your-username", "your-password", BasicRealm = "your-realm")] 
public class HomeController : BaseController 
{ 
    ... 
} 
Basic Authentication in MVC 5 - ここでは、この記事から採取した試料は、あります
関連する問題