async await - सुरक्षा, थ्रेड। वर्तमान प्रिंसिपल, और कॉन्फ़िगर करें(गलत)



async-await claims-based-identity (1)

मेरे परीक्षणों से, ऐसा प्रतीत होता है कि Thread.CurrentPrincipal सही तरीके से प्रवाह करेगा, भले ही आप ConfigureAwait(false) उपयोग करें। निम्न वेबएपीआई कोड एक async कॉल पर प्रिंसिपल और उसके बाद ब्लॉकों को सेट करता है, अन्य धागे को async विधि को फिर से शुरू करने के लिए मजबूर करता है। वह अन्य धागा सही प्राचार्य के वारिस करता है।

private async Task<string> Async()
{
    await Task.Delay(1000).ConfigureAwait(false);
    return "Thread " + Thread.CurrentThread.ManagedThreadId + ": " + Thread.CurrentPrincipal.Identity.Name + "\n";
}

public string Get(int id)
{
    var user = new ClaimsPrincipal(new ClaimsIdentity(
        new[]
        {
            new Claim(ClaimTypes.Name, "Bob"),
        }
    ));
    HttpContext.Current.User = user;
    Thread.CurrentPrincipal = user;

    var ret = "Thread " + Thread.CurrentThread.ManagedThreadId + ": " + Thread.CurrentPrincipal.Identity.Name + "\n";

    ret += Async().Result;

    return ret;
}

जब मैं इस कोड को ISExpress के नए इंस्टेंस पर चलाता हूं, तो मुझे मिलता है:

"Thread 7: Bob\nThread 6: Bob\n"

हालांकि, मुझे इंगित करना चाहिए कि डेडलॉक से बचने के लिए ConfigureAwait(false) का उपयोग ConfigureAwait(false) अनुशंसित नहीं है। यह विशेष रूप से एएसपी.नेट पर सच है यदि संभव हो तो, ConfigureAwait(false) का उपयोग करें और सभी तरह से async उपयोग करें। ध्यान दें कि WebAPI एक पूरी तरह से- async स्टैक है और आपको ऐसा करने में सक्षम होना चाहिए।

थ्रेड का उपयोग कर सकते हैं। कॉन्फ़िगरएवाइट (झूठे) का उपयोग करने वाले संदर्भित लाइब्रेरी में वर्तमान प्रिंसिपल के दावों से कोई परेशानी हो सकती है या क्या निष्पादन सामग्री की तार्किक कॉल संदर्भ की बहती मुझे वहां ख्याल रखेगी? (मेरे पढ़ने और परीक्षण अब तक इंगित करता है कि यह होगा)।

उदाहरण WebAPI नियंत्रक कार्रवाई:

[CustomAuthorizeThatSetsCurrentUsersClaimsToThreadCurrentContextAndHttpContextCurrentUser]
public async Task<Order> Get(int orderId)
{
    return await _orderBusinessLogicLibrary.LoadAsync(orderId); // defaults to .ConfigureAwait(true)
}

बाह्य, संदर्भित पुस्तकालय से उदाहरण लोड फ़ंक्शन:

[ClaimsPrincipalPermission(
    SecurityAction.Demand,
    Operation="Read",
    Resource="Orders")]
[ClaimsPrincipalPermission(
    SecurityAction.Demand,
    Operation="Read",
    Resource="OrderItems")]
public async Task<Order> Load(int orderId)
{
    var order = await _repository.LoadOrderAsync(orderId).ConfigureAwait(false);

    // here's the key line.. assuming this lower-level function is also imposing
    // security constraints in the same way this method does, would
    // Thread.CurrentPrincipal still be correct inside the function below?
    order.Items = await _repository.LoadOrderItemsAsync(orderId).ConfigureAwait(false);
    return order;
}

इसके अलावा, जवाब "अच्छी तरह से ConfigureAwait (झूठे) तब उपयोग नहीं कर सकता!" इससे डेडलॉक जैसी अन्य समस्याएं हो सकती हैं ( एसिंक कोड पर ब्लॉक न करें )।





current-principal