बुनियादी प्रमाणीकरण के लिए मैं एक कस्टम HttpMessageHandler
उदाहरण डैरिन दिमित्रोव के जवाब यहाँ में दिखाया गया है के आधार पर लागू किया है: https://stackoverflow.com/a/11536349/270591मैं कस्टम वेबैपी HttpMessageHandler में उपयोगकर्ता प्रिंसिपल को सुरक्षित रूप से कैसे सेट कर सकता हूं?
कोड उपयोगकर्ता नाम और भूमिकाओं और फिर टाइप GenericPrincipal
का एक उदाहरण principal
बनाता है वर्तमान प्राचार्य को यह प्रिंसिपल सेट धागे की:
Thread.CurrentPrincipal = principal;
एक
ApiController
विधि प्रिंसिपल नियंत्रकों
User
प्रॉपर्टी एक्सेस द्वारा पढ़ा जा सकता बाद में
:
public class ValuesController : ApiController
{
public void Post(TestModel model)
{
var user = User; // this should be the principal set in the handler
//...
}
}
यह ठीक काम करने के लिए जब तक मैं हाल ही में एक कस्टम MediaTypeFormatter
तो जैसे Task
पुस्तकालय का उपयोग करता है जोड़ा लग रहा था:
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content, IFormatterLogger formatterLogger)
{
var task = Task.Factory.StartNew(() =>
{
// some formatting happens and finally a TestModel is returned,
// simulated here by just an empty model
return (object)new TestModel();
});
return task;
}
(मैं इस दृष्टिकोण कुछ नमूना कोड से ReadFromStreamAsync
में Task.Factory.StartNew
के साथ एक कार्य शुरू कर दिया है। है प्रिंसिपल अब और मैं में सेट किया है नहीं नियंत्रक विधि में User
प्रिंसिपल - यह गलत है और समस्या के लिए शायद एकमात्र कारण है)
अब, "कभी-कभी" - और मेरे लिए यह यादृच्छिक प्रतीत होता है MessageHandler, यानी उपयोगकर्ता नाम, Authenticated
ध्वज और भूमिकाएं सभी खो गई हैं। ऐसा लगता है कि कस्टम MediaTypeFormatter संदेशहैंडलर और नियंत्रक विधि के बीच धागे में परिवर्तन का कारण बनता है। मैंने MessageHandler में और नियंत्रक विधि में Thread.CurrentThread.ManagedThreadId
के मानों की तुलना करके इसकी पुष्टि की है। "कभी-कभी" वे अलग होते हैं और फिर प्रिंसिपल "खो गया" होता है।
मैं Thread.CurrentPrincipal
की स्थापना किसी भी तरह नियंत्रक विधि के लिए और में this blog post अनुरोध गुण कस्टम MessageHandler से सुरक्षित रूप से प्राचार्य को हस्तांतरण करने के लिए एक विकल्प के लिए अब देखा है उपयोग किया जाता है:
request.Properties.Add(HttpPropertyKeys.UserPrincipalKey,
new GenericPrincipal(identity, new string[0]));
मुझे लगता है कि परीक्षण करने के लिए चाहता था, लेकिन ऐसा लगता है कि HttpPropertyKeys
वर्ग (जो नामस्थान System.Web.Http.Hosting
में है) में हाल ही में वेबएपी संस्करणों में रिलीज UserPrincipalKey
संपत्ति नहीं है (रिलीज उम्मीदवार और अंतिम सप्ताह भी अंतिम रिलीज)।
मेरा प्रश्न है: मैं ऊपर अंतिम कोड स्निपेट कैसे बदल सकता हूं ताकि यह वर्तमान वेबएपीआई संस्करण के साथ काम कर सके? या आम तौर पर: मैं एक कस्टम संदेश हैंडलर में उपयोगकर्ता प्रिंसिपल कैसे सेट कर सकता हूं और इसे नियंत्रक विधि में विश्वसनीय रूप से एक्सेस कर सकता हूं?
संपादित
यह here उल्लेख किया गया है कि "HttpPropertyKeys.UserPrincipalKey
... “MS_UserPrincipal”
ले कर जाता है", तो मैं का उपयोग करने की कोशिश की:
request.Properties.Add("MS_UserPrincipal",
new GenericPrincipal(identity, new string[0]));
लेकिन यह के रूप में मैं उम्मीद काम नहीं करता है: ApiController.User
संपत्ति में उपरोक्त Properties
संग्रह में प्रिंसिपल शामिल नहीं है।
मैं सुझाव देता हूं कि यह https://github.com/thinktecture/Thinktecture.IdentityModel.45 –