मैं एक WebAPI
समाधान है और मैं token authentication
उपयोग करते हैं, तो प्रवाह निम्नलिखित है:वेबएपीआई और SignalR वेब अनुप्रयोग - प्रमाणित कर रहा है और अधिकृत करना
- उपयोगकर्ता
username
औरpassword
- साख यदि का उपयोग कर लॉगिन करने की कोशिश करता सही हैं, उन्हें निम्नलिखित अनुरोधों में उपयोग करने के लिए टोकन दिया गया है (
AJAX
अनुरोधों के शीर्षलेख में रखा जाना चाहिए)।
अब SignalR
खेल में आता है। चूंकि यह WebSockets
का उपयोग करता है, इसलिए आप हेडर पास करने में सक्षम नहीं हैं। एक समाधान के लिए खोज, मैं निम्नलिखित का सामना करना पड़ा:
- असल
SignalR
कोई ऐसा शीर्ष पास - एक विकल्प नहीं है, क्योंकि यहSignalR
बलोंlongPolling
उपयोग करने के लिए।
$.signalR.ajaxDefaults.headers = { Authorization: "Bearer " + token };
पास ही
token
एकquery string
रूपWebAPI
कॉल के सत्यापन के लिए प्रयोग किया जाता है/याSignalR
के लिए एक कुकी में संग्रहीत है, तो एक प्रदाता है कि किसी तरह unwraps बनाने और पहचान में टोकन फैलाता है। I followed this blog post लेकिन मुझे कुछ याद आ रहा है।फिर एक
query string
के रूप में टोकन पारित/या एक कुकी के रूप में, लेकिन इस बारAuthorize
SignalR
हब या तरीकों के लिए एक कस्टमAuthorize Attribute
पैदा करते हैं। Again a blog post about this. इस समाधान के साथ समस्या टोकन परUnprotect
विधि में थी।अंतिम और सबसे आसान समाधान भी
cookie authentication
सक्षमbearer token authentication
WebAPI
के लिए कॉल का उपयोग रखने के लिए और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
के सत्यापन का एक आसान तरीका में देखते हैं? क्या यह अंतिम दृष्टिकोण है (यदि मैं अनुरोध के साथ कुकी भेजने के लिए दबाने का प्रबंधन करता हूं) उत्पादन में व्यवहार्य है?
मैंने अभी तक कोशिश नहीं की है, हालांकि, यहां 2 लिंक हैं जिन्हें आप अभी पढ़ सकते हैं यदि आपने अभी तक नहीं पढ़ा है: http://www.asp.net/signalr/overview/security/introduction-to-security और http://www.asp.net/signalr/overview/security/hub- प्राधिकरण – BNK
शायद आपके मुद्दे के लिए अन्य लिंक [यहां] (http://blog.shaunxu.me/archive/2014/05/27/set-context-user - प्रिंसिपल-फॉर-कस्टमाइज्ड-प्रमाणीकरण-इन-सिग्नल.एएसपीएक्स) और [यहां] (http://www.jerriepelser.com/blog/popup-oauth-authentication-with-aspnet-and-signalr)। उम्मीद है की यह मदद करेगा! – BNK