ক্যাচ -২২ ডাব্লুআইএফ দ্বারা সুরক্ষিত টিসিপি ডাব্লুসিএফ পরিষেবাটিকে প্রতিরোধ করে; আমার ক্রিসমাস, মানসিক স্বাস্থ্য ধ্বংস


181

ডাব্লুআইএফ ব্যবহার করে একটি স্ট্রিমড ডাব্লুসিএফ নেট.tcp পরিষেবাটি শেষ পয়েন্টটি সুরক্ষিত করার জন্য আমার প্রয়োজন রয়েছে । এটি আমাদের টোকেন সার্ভারের বিপরীতে আগত কলগুলি প্রমাণীকরণ করবে। পরিষেবাটি স্ট্রিম করা হয়েছে কারণ এটি বৃহত পরিমাণে ডেটা এন স্টাফগুলি স্থানান্তর করার জন্য ডিজাইন করা হয়েছে।

এটি অসম্ভব বলে মনে হচ্ছে। এবং যদি আমি ধরা ধরতে না পারি তবে আমার ক্রিসমাসটি নষ্ট হয়ে যাবে এবং আমি ময়দার জলে নিজেকে মেরে ফেলব, যখন আনন্দিত ক্রেতারা আমার ধীরে ধীরে শীতল শরীরের উপরে উঠবে। গুরুতর বিষয়, আপনি না।

কেন এটা অসম্ভব? এখানে ক্যাচ -২২।

ক্লায়েন্টে, আমার টোকেন সার্ভার থেকে জেনেরিক এক্সএমএলসিকিউরিটি টোকেনের সাথে আমার একটি চ্যানেল তৈরি করতে হবে। কোন সমস্যা নেই.

// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();

আমি কি "কোন সমস্যা নেই" বলেছি? সমস্যা নেই। আসলে, NullReferenceExceptionশৈলী সমস্যা।

"ব্রো," আমি ফ্রেমওয়ার্ককে জিজ্ঞাসা করলাম, "আপনি কি চেক করে ফেলেন?" ফ্রেমওয়ার্কটি নিরব ছিল, তাই আমি বিচ্ছিন্ন হয়েছি এবং এটি পেয়েছি

((IChannel)(object)tChannel).
    GetProperty<ChannelParameterCollection>().
    Add(federatedClientCredentialsParameter);

ব্যতিক্রমের উত্স ছিল এবং GetPropertyকলটি ফিরে আসছিল null। তো, ডব্লিউটিএফ? দেখা যাচ্ছে যে আমি যদি বার্তা সুরক্ষা চালু করি এবং ক্লায়েন্টের শংসাপত্র প্রকার সেট করে রাখি IssuedTokenতবে এই সম্পত্তিটি এখন উপস্থিত রয়েছে ClientFactory(প্রিপেইপ: আইচানেল, জারজ মধ্যে কোনও "সেটপ্রপার্টি" সমতুল্য নেই)।

<binding name="OMGWTFLOL22" transferMode="Streamed" >
    <security mode="Message">
        <message clientCredentialType="IssuedToken"/>
    </security>
</binding>

মিষ্টি। আর এনআরই নেই। যাইহোক, এখন আমার ক্লায়েন্ট জন্মের সময় দোষযুক্ত হয়েছে (এখনও তাকে ভালবাসি, তবে)। ডাব্লুসিএফ ডায়াগনস্টিকগুলির মাধ্যমে খনন করা (প্রোটপ: আপনার সবচেয়ে খারাপ শত্রুদের তাদের পিষে ফেলার পরে এবং তাদের আগে চালানোর পরে তাদের মহিলাদের এবং শিশুদের বিলাপগুলি উপভোগ করার আগে এটি করুন), আমি এটি সার্ভার এবং ক্লায়েন্টের মধ্যে সুরক্ষিত অমিলের কারণেই দেখছি।

অনুরোধ করা আপগ্রেড 'নেট.tcp: // লোকালহোস্ট: 49627 / মাই সার্ভিস' দ্বারা সমর্থিত নয়। এটি মেলানো বাছাইয়ের কারণে হতে পারে (উদাহরণস্বরূপ ক্লায়েন্টের উপর সুরক্ষা সক্ষম করা হয়েছে এবং সার্ভারে নয়)।

হোস্টের চিত্রগুলি পরীক্ষা করা হচ্ছে (আবার: ক্রাশ, ড্রাইভ, লগগুলি পড়ুন, বিলাপগুলি উপভোগ করুন), আমি দেখছি এটি সত্য

প্রোটোকল টাইপ অ্যাপ্লিকেশন / ssl-tls একটি পরিষেবাতে প্রেরণ করা হয়েছিল যা এই ধরণের আপগ্রেড সমর্থন করে না।

"ভাল, স্ব," আমি বলি, "আমি কেবল হোস্টের বার্তার সুরক্ষা চালু করব!" এবং আমি করি. এটি দেখতে কেমন লাগে তা যদি জানতে চান তবে এটি ক্লায়েন্ট কনফিগারেশনের একটি সঠিক অনুলিপি। খুঁজে দেখো.

ফলাফল: কাবুম।

বাইন্ডিং ('নেটটসিপিবাইন্ডিং', ' http://tempuri.org/ ') স্ট্রিমিং সমর্থন করে যা বার্তা স্তর সুরক্ষা সহ একসাথে কনফিগার করা যায় না। একটি অন্য স্থানান্তর মোড বা পরিবহন স্তর সুরক্ষা চয়ন বিবেচনা করুন।

সুতরাং, আমার হোস্ট টোকেনের মাধ্যমে উভয়ই স্ট্রিম এবং সুরক্ষিত হতে পারে না । ধরা 22.

tl; dr: WIF ব্যবহার করে আমি কীভাবে একটি স্ট্রিমড নেট.tcp ডাব্লুসিএফ শেষ পয়েন্টটি সুরক্ষিত করতে পারি ???


3
ঠিক আছে, সম্ভবত এখানে অজ্ঞ প্রশ্ন, কিন্তু ডাব্লুআইএফ-এর কি সত্যই বার্তা মোডের প্রয়োজন? পরিবহন মোড মনে হচ্ছে এটি স্ট্রিমিংয়ের সাথে আরও ভাল কাজ করবে, এটি স্পষ্টতই অনির্ধারিত মতো<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>
জোয়াকিম ইসাকসন

3
TransportWithMessageCredential মোড অন্য বিকল্প হতে পারে।
জোছিম ইসাকসন

3
টিএমএলকে, মেসেজসিকিউরিটি বাফার পেডলকে স্বাক্ষর করতে ও এনক্রিপ্ট করতে পারে, তবে স্ট্রিমগুলির সাথে ডিল করার সময় নষ্ট হয়। আপনি কি প্রমাণীকরণ মোড = ইস্যুড টোকেনওভারট্রান্সপোর্ট ব্যবহার করে বিবেচনা করেছেন?
ওনোসনডাই

7
আপনার ছুটিগুলি বাঁচাতে আমি অতীতের কিছু ভূতকে ডেকে আনতে পারি কিনা তা আমাকে দেখতে দিন। এখানে কিছু ইঙ্গিত রয়েছে: social.msdn.microsoft.com/ Forums
vstudio

2
অন্যেরা যে পরীক্ষা-নিরীক্ষা প্রকল্প ব্যবহার করতে পারে তার কোনও পোস্ট আপনি পোস্ট করতে পারেন?
এন্টিডাহ

উত্তর:


41

স্ট্রিমিং সহ কয়েকটি ক্ষেত্রে ডাব্লুসিএফের নজর রয়েছে (আমি আপনাকে দেখছি, এমটিওএম 1 ) এটি কীভাবে বেশিরভাগ লোকেরা ভাবতে পারে যেভাবে কাজ করা উচিত সেভাবে পূর্বসূচীটি সম্পাদন করতে ব্যর্থ হওয়ার কারণে এটি মৌলিক সমস্যার কারণে (এটি কেবলমাত্র সেই চ্যানেলের জন্য পরবর্তী অনুরোধগুলিকেই প্রভাবিত করে , প্রথম অনুরোধ নয়) ঠিক আছে, সুতরাং এটি ঠিক আপনার সমস্যা নয় তবে দয়া করে অনুসরণ করুন আমি শেষ পর্যন্ত আপনার কাছে যাব। সাধারণত এইচটিটিপি চ্যালেঞ্জ এ জাতীয়ভাবে কাজ করে:

  1. ক্লায়েন্ট বেনামে সার্ভার হিট
  2. সার্ভার বলে, দুঃখিত, 401, আমার প্রমাণীকরণের প্রয়োজন
  3. ক্লায়েন্ট প্রমাণীকরণ টোকেন সহ সার্ভার হিট
  4. সার্ভার গ্রহণ করে।

এখন, আপনি যদি কখনও সার্ভারে ডাব্লুসিএফ শেষ পয়েন্টে এমটিএমএম স্ট্রিমিং সক্ষম করার চেষ্টা করেন তবে এটি অভিযোগ করবে না। তবে, আপনি যখন এটি ক্লায়েন্ট প্রক্সিতে কনফিগার করবেন (আপনার যেমন হওয়া উচিত, তাদের অবশ্যই বাইন্ডিংয়ের সাথে মিল থাকতে হবে) এটি জ্বলন্ত মৃত্যুর মধ্যে বিস্ফোরিত হবে। এর কারণ হ'ল ডাব্লুসিএফ যে ঘটনাগুলি প্রতিরোধ করার চেষ্টা করছে তার উপরের ক্রমটি হ'ল:

  1. ক্লায়েন্ট একক পোস্টে বেনামে সার্ভারে 100MB ফাইল প্রবাহিত করে
  2. সার্ভার দুঃখিত, 401, আমার প্রমাণীকরণের প্রয়োজন
  3. ক্লায়েন্ট আবার 100MB ফাইলকে একটি প্রমাণীকরণ শিরোনাম সহ সার্ভারে প্রবাহিত করে
  4. সার্ভার গ্রহণ করে।

লক্ষ্য করুন যে আপনি যখন মাত্র 100MB প্রেরণের প্রয়োজন তখন আপনি কেবল 200MB সার্ভারে প্রেরণ করেছিলেন। ঠিক আছে, এই সমস্যা। উত্তরটি প্রথম প্রয়াসে প্রমাণীকরণ পাঠানো হয় তবে কাস্টম আচরণ না লিখে WCF এ এটি সম্ভব নয় is যাইহোক, আমি digress।

তোমার সমস্যা

প্রথমে, আমি আপনাকে বলি যে আপনি যা চেষ্টা করছেন তা অসম্ভব 2 । এখন, আপনাকে নিজের চাকা ঘুরিয়ে দেওয়া বন্ধ করার জন্য, আমাকে বলি কেন:

এটি আমাকে আঘাত করে যে আপনি এখন একই ধরণের সমস্যার মধ্যে ঘুরে বেড়াচ্ছেন। আপনি যদি বার্তা স্তর সুরক্ষা সক্ষম করে থাকেন তবে ক্লায়েন্টকে ডাব্লুএস-সুরক্ষা দ্বারা প্রয়োজনীয় স্বাভাবিক হ্যাশ ফাংশন এবং এক্সএমএল স্বাক্ষর দিয়ে বার্তাটি বন্ধ করে দেওয়ার আগে অবশ্যই মেমরিটিতে ডেটার পুরো প্রবাহটি লোড করতে হবে। যদি একক বার্তা (যা আসলে কোনও বার্তা নয়, তবে এটি একটি একক ধারাবাহিক স্ট্রিম) সাইন করতে পুরো স্ট্রিমটি পড়তে হয় তবে আপনি এখানে সমস্যাটি দেখতে পাচ্ছেন। ডাব্লুসিএফ বার্তা সুরক্ষা গণনা করতে একবার "স্থানীয়ভাবে" এটি স্ট্রিম করতে হবে, তারপরে এটি সার্ভারে প্রেরণে এটি আবার প্রবাহিত করবে। এটি স্পষ্টত একটি নির্বোধ জিনিস, তাই ডাব্লুসিএফ স্ট্রিমিং ডেটার জন্য বার্তা স্তর সুরক্ষাটির অনুমতি দেয় না।

সুতরাং, এখানে সাধারণ উত্তরটি হ'ল আপনার অবশ্যই টোকেনটিকে প্রাথমিক ওয়েব পরিষেবাতে পরামিতি হিসাবে পাঠানো উচিত, বা একটি এসওএপি শিরোনাম হিসাবে এবং এটি যাচাই করার জন্য একটি কাস্টম আচরণ ব্যবহার করা উচিত। এটি করার জন্য আপনি ডাব্লুএস-সুরক্ষা ব্যবহার করতে পারবেন না। সত্যি বলতে কী, এটি কেবল একটি ডাব্লুসিএফ সমস্যা নয় - আমি দেখতে পাচ্ছি না যে এটি ব্যবহারিকভাবে অন্য কোনও স্ট্যাকের জন্য কীভাবে কাজ করতে পারে।

এমটিওএম সমস্যা সমাধান করা

এটি কেবলমাত্র উদাহরণস্বরূপ যা আমি মৌলিক প্রমাণীকরণের জন্য কীভাবে আমার এমটিএমএম স্ট্রিমিংয়ের সমস্যাটি সমাধান করেছি, সম্ভবত আপনি এটির সাহস নিতে পারেন এবং আপনার সমস্যার জন্য অনুরূপ কিছু বাস্তবায়ন করতে পারেন। এটির মূল বিষয়টি হ'ল আপনার কাস্টম বার্তা পরিদর্শককে সক্ষম করতে, আপনি পরিবহন স্তর (এসএসএল) ব্যতীত ক্লায়েন্ট প্রক্সি (এটি সার্ভারে সক্ষম থাকে) এর সমস্ত ধারণা অক্ষম করতে হবে:

this._contentService.Endpoint.Behaviors.Add(
    new BasicAuthenticationBehavior(
        username: this.Settings.HttpUser,
        password: this.Settings.HttpPass));
var binding = (BasicHttpBinding)this._contentService.Endpoint.Binding;
binding.Security.Mode = BasicHttpSecurityMode.Transport; // SSL only            
binding.Security.Transport.ClientCredentialType = 
   HttpClientCredentialType.None; // Do not provide

নোট করুন যে আমি এখানে পরিবহন সুরক্ষা বন্ধ করেছি কারণ আমি একটি বার্তা পরিদর্শক এবং কাস্টম আচরণ ব্যবহার করে তা সরবরাহ করব:

internal class BasicAuthenticationBehavior : IEndpointBehavior
{
    private readonly string _username;
    private readonly string _password;

    public BasicAuthenticationBehavior(string username, string password)
    {
        this._username = username;
        this._password = password;
    }
    public void AddBindingParameters(ServiceEndpoint endpoint, 
        BindingParameterCollection bindingParameters) { }
    public void ApplyClientBehavior(ServiceEndpoint endpoint,
        ClientRuntime clientRuntime)
    {
        var inspector = new BasicAuthenticationInspector(
            this._username, this._password);
        clientRuntime.MessageInspectors.Add(inspector);
    }
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
        EndpointDispatcher endpointDispatcher) { }
    public void Validate(ServiceEndpoint endpoint) { }
}

internal class BasicAuthenticationInspector : IClientMessageInspector
{
    private readonly string _username;
    private readonly string _password;

    public BasicAuthenticationInspector(string username, string password)
    {
        this._username = username;
        this._password = password;
    }

    public void AfterReceiveReply(ref Message reply,
        object correlationState) { }

    public object BeforeSendRequest(ref Message request,
        IClientChannel channel)
    {
        // we add the headers manually rather than using credentials 
        // due to proxying issues, and with the 101-continue http verb 
        var authInfo = Convert.ToBase64String(
            Encoding.Default.GetBytes(this._username + ":" + this._password));

        var messageProperty = new HttpRequestMessageProperty();
        messageProperty.Headers.Add("Authorization", "Basic " + authInfo);
        request.Properties[HttpRequestMessageProperty.Name] = messageProperty;

        return null;
    }
}

সুতরাং, এই উদাহরণটি এমটিওএম ইস্যুতে ভুগছেন এমন ব্যক্তির পক্ষে, তবে প্রাথমিক ডাব্লুআইএফ-সুরক্ষিত টোকেন পরিষেবা দ্বারা উত্পন্ন আপনার টোকেনকে সত্যায়িত করার জন্য অনুরূপ কিছু কার্যকর করার জন্য কঙ্কাল হিসাবেও।

আশাকরি এটা সাহায্য করবে.

(1) বড় ডেটা এবং স্ট্রিমিং

(২) ডাব্লুসিএফ-তে বার্তা সুরক্ষা ("অসুবিধাগুলি" দেখুন)


MTOM and Basic Authorization, এবং এমটিওএম এবং ওআউথ 2 ?
কিকিনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.