كيفية استخدام System.IdentityModel في تطبيق خادم العميل الخاص

StackOverflow https://stackoverflow.com/questions/646395

  •  22-07-2019
  •  | 
  •  

سؤال

لقد حصلت على تطبيق بسيط لخادم العميل يعتمد على TCPClient/TCPlistener و SSLStream. يمكن للعملاء مصادقة أنفسهم على الخادم باستخدام X509Certificate أو عن طريق إرسال اسم المستخدم وكلمة المرور بعد إنشاء SSLStream.

WCF يستخدم System.IdentityModel مساحة الاسم لأغراض المصادقة ، ولكن فيما يبدو يمكن استخدامها في التطبيقات التعسفية-والتي تبدو مثيرة للاهتمام. المعلومات حول كيفية القيام بذلك متناثرة على الرغم من (أو أن Google Foo ضعيف اليوم).

لذا ، سؤالي هو: ما الذي يجب علي فعله لدمج System.IdentityModel مع طلبي؟ لست متأكدًا مما إذا كنت بحاجة إلى كل هذه الأشياء ، ولكن سيكون من الجيد أن يتمكن المستخدمون من تسجيل الدخول فقط باستخدام حساب Windows الخاص بهم أو أي آلية مصادقة أخرى متوفرة. (لسوء الحظ ، لا يمكنني التبديل إلى WCF ولكن علي استخدام البروتوكول المخصص ، على الرغم من أنني أستطيع إجراء بعض التغييرات عليه إذا لزم الأمر.)

هل كانت مفيدة؟

المحلول

كان Google Foo الخاص بي ضعيفًا بالفعل. الجواب مباشرة وراء الرابط في سؤالي. لذا إليك بعض الروابط هذه المدونة في حال كان لدى شخص ما نفس السؤال في نهاية المطاف.

أولاً ، يجب أن تحاول أن تفهم "هذه الادعاءات المحددة":

ثم ، عليك أن تعرف من أين تأتي مجموعات المطالبة:

مسلحًا بهذه المعرفة ، يصبح الأمر بسيطًا جدًا.

إذا فهمت ذلك بشكل صحيح ، فإن سير العمل الأساسي سيكون شيئًا من هذا القبيل:

  1. العميل يخلق SecurityToken باستخدام SecurityTokenProvider
  2. العميل تسلسل SecurityToken باستخدام SecurityTokenSerializer
  3. خادم يستحضر SecurityToken باستخدام SecurityTokenSerializer
  4. ينشئ الخادم IAuthorizationPolicyS باستخدام SecurityTokenAuthenticator
  5. ينشئ الخادم AuthorizationContext من IAuthorizationPolicyس
  6. فعله

مثال:

// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");

// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;

// ... transmit SecurityToken to server ...

// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
    UserNamePasswordValidator.None);

// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);

// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);

إلى عن على X509SecurityTokenS استخدم A. X509SecurityTokenProvider/Authenticator. إلى عن على WindowsSecurityTokenS هناك أ WindowsSecurityTokenAuthenticator لكن ليس مزودًا ؛ بدلا من ذلك ، استخدم WindowsSecurityToken البناء:

var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());

هذا يعمل بشكل جيد. الشيء الوحيد الذي حذفته حتى الآن هو التسلسل المميز. هناك SecurityTokenSerializer الفئة التي لديها تطبيق واحد في إطار .NET: WSSecurityTokenSerializer الفصل الذي يأتي مع WCF.

التسلسل UserNameSecurityTokenرمل X509SecurityTokenيعمل S مثل السحر (لم يحاول إزالة التسلسل) ، ولكن WindowsSecurityTokenيبدو أن S غير مدعوم من قبل المسلسل. هذا يتركني مع طريقتي المصادقة التي لدي بالفعل (الشهادات واسم المستخدم/كلمة المرور) وكما لم أكن أريد ذلك AuthorizationContext على أي حال ، سألتزم بما لدي :)

نصائح أخرى

ليس لدي سمعة لنشر تعليقًا على الحل الحالي ، لكنني أود نشر عنوان URL الجديد للمدونات المدرجة في الحل ، لأن هؤلاء لا يعملون بعد الآن. إذا تمكن شخص ما من تغيير هذا إلى تعليق ، فسأكون ملزماً كثيرًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top