2015-09-04 2 views
8

मैं एक WebAPI समाधान है और मैं token authentication उपयोग करते हैं, तो प्रवाह निम्नलिखित है:वेबएपीआई और SignalR वेब अनुप्रयोग - प्रमाणित कर रहा है और अधिकृत करना

  • उपयोगकर्ता username और password
  • साख यदि का उपयोग कर लॉगिन करने की कोशिश करता सही हैं, उन्हें निम्नलिखित अनुरोधों में उपयोग करने के लिए टोकन दिया गया है (AJAX अनुरोधों के शीर्षलेख में रखा जाना चाहिए)।

अब SignalR खेल में आता है। चूंकि यह WebSockets का उपयोग करता है, इसलिए आप हेडर पास करने में सक्षम नहीं हैं। एक समाधान के लिए खोज, मैं निम्नलिखित का सामना करना पड़ा:

  1. असल SignalR कोई ऐसा शीर्ष पास - एक विकल्प नहीं है, क्योंकि यह SignalR बलों longPolling उपयोग करने के लिए।

$.signalR.ajaxDefaults.headers = { Authorization: "Bearer " + token };

  1. पास ही token एक query string रूप WebAPI कॉल के सत्यापन के लिए प्रयोग किया जाता है/या SignalR के लिए एक कुकी में संग्रहीत है, तो एक प्रदाता है कि किसी तरह unwraps बनाने और पहचान में टोकन फैलाता है। I followed this blog post लेकिन मुझे कुछ याद आ रहा है।

  2. फिर एक query string के रूप में टोकन पारित/या एक कुकी के रूप में, लेकिन इस बार AuthorizeSignalR हब या तरीकों के लिए एक कस्टम Authorize Attribute पैदा करते हैं। Again a blog post about this. इस समाधान के साथ समस्या टोकन पर Unprotect विधि में थी।

  3. अंतिम और सबसे आसान समाधान भी cookie authentication सक्षम bearer token authenticationWebAPI के लिए कॉल का उपयोग रखने के लिए और OWIN Middleware केन्द्रों पर कॉल को अधिकृत करने देने के लिए है। (यह समाधान वास्तव में काम करता है)।

अब, मुद्दा यह है कि, Individual User Accounts के साथ एक WebAPI ऐप्स के लिए डिफ़ॉल्ट टेम्पलेट का उपयोग कर (टोकन प्रमाणीकरण के साथ तो) यह भी कुकी भेजता जब भी मैं API के लिए एक AJAX अनुरोध भेजने के लिए है।

public partial class Startup 
    { 
     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

     public static string PublicClientId { get; private set; } 

     // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
     public void ConfigureAuth(IAppBuilder app) 
     { 
      // Configure the db context and user manager to use a single instance per request 
      app.CreatePerOwinContext(ApplicationDbContext.Create); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 


      PublicClientId = "self"; 
      OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/Token"), 
       Provider = new ApplicationOAuthProvider(PublicClientId), 
       AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
       AllowInsecureHttp = true 
      }; 

      app.UseOAuthBearerTokens(OAuthOptions); 

     } 
    } 



public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

इस यहां तक ​​कि अगर मैं था:

config.SuppressDefaultHostAuthentication(); 
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

Authorization: Bearer 2bTw5d8Vf4sKR9MNMqZsxIOPHp5qtXRTny5YEC_y7yWyrDLU0__q8U8Sbo7N7XBjPmxZXP18GRXjDVb3yQ9vpQnWXppRhVA8KDeGg2G5kITMxiOKvGMaKwyUGpORIeZ0UHyP9jA2fX9zPwzsCqHmq-LoGKls0MQNFjXgRGCCCvro5WPMAJcLs0kUoD_2W_TOTy9_T-koobw-DOivnazPo2Z-6kfXaIUuZ1YKdAbcSJKzpyPR_XrCt4Ma2fCf-LcpMPGo4gDFKfxWdId0XtfS9S-5cXmmOmGM4Y6MkAUK8O9sZlVrpmpvV0hjXF2QwfLtQViPyEctbTr1vPBNn014n60APwGSGnbUJBWMvJhqcjI5pWoubCmk7OHJrn052U_F3bDOi2ha1mVjvhVY1XMAuv2c3Pbyng2ZT_VuIQI7HjP4SLzV6JjRctfIPLEh67-DFp585sJkqgfSyM6h_vR2gPA5hDocaFs73Qa22QMaLRrHThU0HM8L3O8HgFl5oJtD 
Referer: http://localhost:15379/index.html 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,ro;q=0.6 
Cookie: .AspNet.Cookies=E71BnnTMv8JJ4hS9K46Y2yIbGMQCTS4MVBWBXezUYCSGXPbUPNZh98Q0IElQ0zqGyhB7OpYfdh10Kcy2i5GrWGSiALPPtOZUmszfAYrLZwG2JYiU5MSW80OGZVMY3uG2U1aqvvKJpv7eJwJSOoS4meD_3Qy8SwRzTg8feZArAE-REEXSsbPfq4jQBUUbxfDAyuPVRsLNfkn4oIAwZTs85IulRZI5mLnLqOS7VLejMGIWhkuyOWvvISu1pjsP5FMDXNwDkjv2XCaOpRzZYUxBQJzkcdpDjwW_VO2l7HA263NaG_IBqYpLqG57Fi-Lpp1t5Deh2IRB0VuTqAgrkwxifoBDCCWuY9gNz-vNjsCk4kZc8QKxf7el1gu9l38Ouw6K1EZ9y2j6CGWmW1q-DobaK9JXOQEPm_LGyaGPM5to2vchTyjuieZvLBAjxhLKnXdy34Z7MZXLVIwmpSmyPvmbIuH9QzOvTWD-I1AQFJyCDw8 

आप टोकन प्रमाणीकरण के साथ SignalR के सत्यापन का एक आसान तरीका में देखते हैं? क्या यह अंतिम दृष्टिकोण है (यदि मैं अनुरोध के साथ कुकी भेजने के लिए दबाने का प्रबंधन करता हूं) उत्पादन में व्यवहार्य है?

+1

मैंने अभी तक कोशिश नहीं की है, हालांकि, यहां 2 लिंक हैं जिन्हें आप अभी पढ़ सकते हैं यदि आपने अभी तक नहीं पढ़ा है: http://www.asp.net/signalr/overview/security/introduction-to-security और http://www.asp.net/signalr/overview/security/hub- प्राधिकरण – BNK

+0

शायद आपके मुद्दे के लिए अन्य लिंक [यहां] (http://blog.shaunxu.me/archive/2014/05/27/set-context-user - प्रिंसिपल-फॉर-कस्टमाइज्ड-प्रमाणीकरण-इन-सिग्नल.एएसपीएक्स) और [यहां] (http://www.jerriepelser.com/blog/popup-oauth-authentication-with-aspnet-and-signalr)। उम्मीद है की यह मदद करेगा! – BNK

उत्तर

0

उस विशेष परियोजना पर काम करते समय, मैं केवल कुकी प्रमाणीकरण और सीएसआरएफ का उपयोग कर समाप्त हुआ, लेकिन मुझे अभी भी बियरर टोकन प्रमाणीकरण का उपयोग करके वेबएपी और सिग्नलआर को प्रमाणित करने में रुचि थी।

For a working sample, please see this GitHub repository.

मैं एक OAuthBearerTokenAuthenticationProvider वर्ग कुकी से टोकन प्राप्त करने की कोशिश करता है कि बना दी।

public void ConfigureOAuth(IAppBuilder app) 
    { 
     OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      Provider = new AuthorizationServerProvider() 
     }; 

     app.UseOAuthAuthorizationServer(OAuthServerOptions); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() 
     { 
      Provider = new OAuthBearerTokenAuthenticationProvider() 
     }); 

    } 

For a working sample, please see this GitHub repository.

आशा इस कुछ बिंदु पर कोई मदद करता है:

public class OAuthBearerTokenAuthenticationProvider : OAuthBearerAuthenticationProvider 
    { 
     public override Task RequestToken(OAuthRequestTokenContext context) 
     { 
      var tokenCookie = context.OwinContext.Request.Cookies["BearerToken"]; 

      if (!String.IsNullOrEmpty(tokenCookie)) 
       context.Token = tokenCookie; 

      return Task.FromResult<object>(null); 
     } 
    } 

और यहाँ Startup वर्ग कि प्रमाणीकरण के साथ सौदों में विधि है।

संबंधित मुद्दे