2014-09-02 32 views
5

ASP.NET WEB API her gelen istek (URL) okuma. Bu çerçevede, gelen her talebi (url) bir anahtar için kontrol ettik ve bir mülke atadık. BizOnActionExecuting() bizim özel mantık sağlamak için geçersiz Controller sınıftan & türetilmiş özel bir sınıf yarattı.Ben <code>ASP.NET MVC</code> çerçeve kullanıyordum

nasıl ASP.NET WEB API aynı elde edebilirsiniz ?

//Implementation from ASP.NET MVC 

public class ApplicationController : Controller 
{  
    public string UserID { get; set; } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!string.IsNullOrEmpty(Request.Params["uid"])) 
      UserID = Request.Params["uid"]; 

     base.OnActionExecuting(filterContext); 
    }  
} 

Ben ASP.NET WEB API çalıştık Ne: - Bu çalışma olmasına rağmen, bu doğru bir yaklaşım olup olmadığını merak?

ActionFilterAttribute sınıfını & devralan başka bir sınıf oluşturuldu taban kontrolörü

public class BaseApiController : ApiController 
    { 
     public string UserID { get; set; } 
    } 

düzenlendi Ben

public class TokenFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
      { 
       var queryString = actionContext.Request.RequestUri.Query; 
       var items = HttpUtility.ParseQueryString(queryString); 
       var userId = items["uid"]; 

       ((MyApi.Data.Controllers.BaseApiController)(actionContext.ControllerContext.Controller)).UserID = userId; 


      } 
    } 

Şimdi bu sınıf

kayıt() OnActionExecuting geçersiz
public static void Register(HttpConfiguration config) 
{ 
    config.Filters.Add(new TokenFilterAttribute()); 
} 

cevap

7

ASP.NET Web API gelen mesaj işleyicileri kullanabilirsiniz. Sorgu dizesi, URL veya HTTP Başlığı bir takım kullanıcı jetonu almak için gereken zaman, tipik bir güvenlik scenation olan

sonra, URL'den userId ayıklamak için parametre olarak kullanmak için sadece ihtiyaç 1.When

http://www.asp.net/web-api/overview/advanced/http-message-handlers

o sn 2.Eğer sizin Api yöntemi ve ASP.NET WebAPI böyle istek

http://.../15222/roles?isExternalUser=false 

için çalışmak

[HttpGet, Route("{userId}/roles")]  
public UserRoles GetUserRoles(string userId, [FromUri] bool isExternalUser = true) 

gibi sizin için işi yapacak urity senaryosu, lütfen http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api 'a bakın Temelde bazı MessageHandler'a ihtiyacınız olacak ya da filtre niteliklerini de kullanabilirsiniz, ASP.NET Web API'sinde her aramayı engellemek için bir mekanizmadır. Her isteği işlemek gerekiyorsa

sonra messageHandler sizin yoludur. MessageHanler'ı uygulamanız ve sonra kaydetmeniz gerekiyor.

, tipik messageHandler SendAsync yöntemi overriden ile MessageHandler veya DelegatingHandler türetilmiş sınıf kolayca söylemek:

class AuthenticationHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     // Your code here 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

And you need register it 

static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    {     
     // Other code for WebAPI registerations here 
     config.MessageHandlers.Add(new AuthenticationHandler());    
    } 
} 

ve (WebApiConfig.Register

Global.asax.cs

den GlobalConfiguration diyoruz.Yapılandırma); (Eğer IIdentity gelen IPrincipal ve UidIdentity adresinin UidPrincipal imeplement gerek burada) bu tür işleyici

bazı örnek kukla hipotetik uygulaması

public class AuthenticationHandler : DelegatingHandler 
{  
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     try 
     { 
      var queryString = actionContext.Request.RequestUri.Query; 
      var items = HttpUtility.ParseQueryString(queryString); 
      var userId = items["uid"]; 

      // Here check your UID and maybe some token, just dummy logic 
      if (userId == "D8CD2165-52C0-41E1-937F-054F24266B65") 
      {   
       IPrincipal principal = new UidPrincipal(new UidIdentity(uid), null); 

       // HttpContext exist only when hosting as asp.net web application in IIS or IISExpress 
       if (HttpContext.Current != null) 
       { 
        HttpContext.Current.User = principal; 
       } 
       else 
       { 
        Thread.CurrentPrincipal = principal; 
       } 
       return base.SendAsync(request, cancellationToken); 
      } 
      catch (Exception ex) 
      { 
       this.Log().Warn(ex.ToString()); 
       return this.SendUnauthorizedResponse(ex.Message); 
      } 
     } 
     else 
     { 
      return this.SendUnauthorizedResponse(); 
     } 
     } 
     catch (SecurityTokenValidationException) 
     { 
      return this.SendUnauthorizedResponse(); 
     } 
    } 
} 

Ve bazı ASP.NET WebAPI yönteminde veya WebAPI bazı özelliğinden erişimi sağlar o sınıf

var uid = ((UidIdentity)User.Identity).Uid 
+0

Hızlı yardım için teşekkür ederiz. Soruyu göndermeden önce bu URL'yi kontrol ediyordum ve durumumun bunun nasıl yardımcı olacağını bilmiyordum. Lütfen bana daha fazla bilgi verebilir misiniz? – SharpCoder

+0

Biraz kod eklemeyi ve sizin için daha net hale getirmeyi denedim. Kullanım durumunuz nedir? Her bir isteğin neden Kullanıcı Kimliği ayıklamasına ihtiyacınız var? – Regfor

+0

İsteğin bazıları 'userId 'sorgu dizesi olarak geçirilecek. Tüm istediğim, her isteği kontrol etmek ve sorgu dizesi 'userId' ise, onu okuyacağım ve 'BaseController' içinde' UserID' özelliğine atayacağım. 'BaseController', ApiController'den miras alacaktır. Ve tüm denetleyicilerim “BaseController” dan miras kalacaklar. Hangi 'Kullanıcı Kimliği' özelliği tüm kontrolörler için kullanılabilir olmasını sağlayacaktır. Sorun "DelegatingHandler", ASP.NET MVC'de bulunan "IActionFilter" arabiriminin aksine bir sınıftır. – SharpCoder

İlgili konular