كيفية استخدام System.IdentityModel في تطبيق خادم العميل الخاص
-
22-07-2019 - |
سؤال
لقد حصلت على تطبيق بسيط لخادم العميل يعتمد على TCPClient/TCPlistener و SSLStream. يمكن للعملاء مصادقة أنفسهم على الخادم باستخدام X509Certificate أو عن طريق إرسال اسم المستخدم وكلمة المرور بعد إنشاء SSLStream.
WCF يستخدم System.IdentityModel مساحة الاسم لأغراض المصادقة ، ولكن فيما يبدو يمكن استخدامها في التطبيقات التعسفية-والتي تبدو مثيرة للاهتمام. المعلومات حول كيفية القيام بذلك متناثرة على الرغم من (أو أن Google Foo ضعيف اليوم).
لذا ، سؤالي هو: ما الذي يجب علي فعله لدمج System.IdentityModel مع طلبي؟ لست متأكدًا مما إذا كنت بحاجة إلى كل هذه الأشياء ، ولكن سيكون من الجيد أن يتمكن المستخدمون من تسجيل الدخول فقط باستخدام حساب Windows الخاص بهم أو أي آلية مصادقة أخرى متوفرة. (لسوء الحظ ، لا يمكنني التبديل إلى WCF ولكن علي استخدام البروتوكول المخصص ، على الرغم من أنني أستطيع إجراء بعض التغييرات عليه إذا لزم الأمر.)
المحلول
كان Google Foo الخاص بي ضعيفًا بالفعل. الجواب مباشرة وراء الرابط في سؤالي. لذا إليك بعض الروابط هذه المدونة في حال كان لدى شخص ما نفس السؤال في نهاية المطاف.
أولاً ، يجب أن تحاول أن تفهم "هذه الادعاءات المحددة":
- المطالبات
- مجموعات المطالبة
- فحص مجموعات المطالبة
- مجموعات مطالبة Windows و X509Certificate
- العمليات النموذجية على مجموعات المطالبة
ثم ، عليك أن تعرف من أين تأتي مجموعات المطالبة:
مسلحًا بهذه المعرفة ، يصبح الأمر بسيطًا جدًا.
إذا فهمت ذلك بشكل صحيح ، فإن سير العمل الأساسي سيكون شيئًا من هذا القبيل:
- العميل يخلق
SecurityToken
باستخدامSecurityTokenProvider
- العميل تسلسل
SecurityToken
باستخدامSecurityTokenSerializer
- خادم يستحضر
SecurityToken
باستخدامSecurityTokenSerializer
- ينشئ الخادم
IAuthorizationPolicy
S باستخدامSecurityTokenAuthenticator
- ينشئ الخادم
AuthorizationContext
منIAuthorizationPolicy
س - فعله
مثال:
// 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);
إلى عن على X509SecurityToken
S استخدم A. X509SecurityTokenProvider
/Authenticator
. إلى عن على WindowsSecurityToken
S هناك أ WindowsSecurityTokenAuthenticator
لكن ليس مزودًا ؛ بدلا من ذلك ، استخدم WindowsSecurityToken
البناء:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
هذا يعمل بشكل جيد. الشيء الوحيد الذي حذفته حتى الآن هو التسلسل المميز. هناك SecurityTokenSerializer
الفئة التي لديها تطبيق واحد في إطار .NET: WSSecurityTokenSerializer
الفصل الذي يأتي مع WCF.
التسلسل UserNameSecurityToken
رمل X509SecurityToken
يعمل S مثل السحر (لم يحاول إزالة التسلسل) ، ولكن WindowsSecurityToken
يبدو أن S غير مدعوم من قبل المسلسل. هذا يتركني مع طريقتي المصادقة التي لدي بالفعل (الشهادات واسم المستخدم/كلمة المرور) وكما لم أكن أريد ذلك AuthorizationContext
على أي حال ، سألتزم بما لدي :)
نصائح أخرى
ليس لدي سمعة لنشر تعليقًا على الحل الحالي ، لكنني أود نشر عنوان URL الجديد للمدونات المدرجة في الحل ، لأن هؤلاء لا يعملون بعد الآن. إذا تمكن شخص ما من تغيير هذا إلى تعليق ، فسأكون ملزماً كثيرًا.