ASP.Net خدمة WCF هذا الموضوع.CurrentPrincipal يتم القاؤها من قبل بعض اعتراضية في ميكرونيزيا (WIF) البيئة
-
20-09-2019 - |
سؤال
لدي كل مكالمة خدمة WCF التي يتم استضافتها في IIS (.svc).في خدمة منشئ ، الخيط.CurrentPrincipal = HttpContext.الحالي.المستخدم كما في هذه المادة.في هذه الحالة HttpContext.الحالي.المستخدم هو من نوع مايكروسوفت.IdentityModel.المطالبات.ClaimsPrincipal وقد المطالبات التي تم إرسالها من العرف السلبي STS.
ومع ذلك ، في أقرب وقت كنت خطوة في خدمة العملية ودراسة الخيط.CurrentPrincipal, ، في حين أن هذا الكائن لا يزال من نوع مايكروسوفت.IdentityModel.المطالبات.ClaimsIdentity, الكائن نفسه لم يعد نفس HttpContext.الحالي.المستخدم (IsAuthenticated = false ، AuthenticationType = "" واسم باطل على الموضوع.CurrentPrincipal.الهوية) ، في حين أن هذه القيم لا تزال تملأ بشكل صحيح على HttpContext.الحالي.المستخدم.هذا يقول لي أن شيئا ما هو اعتراض الاتصال إلى العملية بشكل غير صحيح تغيير الرئيسي الحالي إلى بعض العامة ، فارغة ، غير مصادق المطالبات الرئيسية.
راجعت موضوع الهوية في منشئ وكذلك في العملية و هو نفسه في كل الأماكن ، وتقييم الخيط.CurrentPrincipal في الإطار الحالي بعد تكليف من HttpContext.الحالي.المستخدم يظهر أن موضوع الهوية يتم تعيين بشكل صحيح في منشئ لذا هو بالتأكيد شيء المنفذة بين منشئ الطريقة و أن شيئا ما تغير الخيط.CurrentPrincipal.
هل لدى أي شخص أي فكرة ماذا يفعل هذا, و كيف يمكن أن تذهب حول منع / إصلاح هذا السلوك ؟
المحلول 2
عند تكوين خدمة WIF الاتحاد اتصل
FederatedServiceCredentials.ConfigureServiceHost(this);
جزء من هذه الدعوة هل هي إعداد مخصص ServiceAuthorizationManager من نوع IdentityModelServiceAuthorizationmanager على الخدمة المضيف.هذا تصريح مدير يبدو أن يطلق على ما بين التنشيط (البناء) على سبيل المثال و تنفيذ العملية ، و ذلك بالكتابة الخيط.CurrentPrincipal مع مثيل IClaimsPrincipal, لكن لا يبدو أن ندرك أنه يعمل في ASP.NET وضع التوافق ، لذلك لا سحب الرئيسية من HttpContext.الحالي.المستخدم.
وكنت قادرا على تجاوز هذا السلوك المستمدة من IdentityModelServiceAuthorizationmanager و تجاوز CheckAccess الطريقة كما يلي:
public class CustomAuthorizationManager : IdentityModelServiceAuthorizationManager
{
public override bool CheckAccess(System.ServiceModel.OperationContext operationContext, ref System.ServiceModel.Channels.Message message)
{
var result = base.CheckAccess(operationContext, ref message);
var properties = operationContext.ServiceSecurityContext.AuthorizationContext.Properties;
properties["Principal"] = System.Web.HttpContext.Current.User;
return result;
}
}
هذا ثم يحصل تطبيق الخدمة المضيف على النحو التالي:
protected override void InitializeRuntime()
{
FederatedServiceCredentials.ConfigureServiceHost(this);
this.Authorization.ServiceAuthorizationManager = new CustomAuthorizationManager();
base.InitializeRuntime();
}
و الآن عندما تدخل الخدمة العملية ، يجب الصحيح IClaimsPrincipal على الخيط.CurrentPrincipal, لذا التعريفي PrincipalPermission الآن يعمل كما هو متوقع.
نصائح أخرى
لقد واجهت مشكلة مماثلة.أنا وضعت بلدي مخصص الرئيسية في منشئ من خدمة WCF.عندما تركت منشئ ، ودخل طريقة اتصلت الموضوع.currentprincipal كان تجاوز من قبل واحد فارغ.لقد حل هذا عن طريق إضافة السلوك التالي:
<serviceAuthorization principalPermissionMode="None"></serviceAuthorization>
هذا يعمل بشكل جيد بالنسبة لي.
confguration إعدادات الاتصال FederatedServiceCredentials.ConfigureServiceHost(هذا);
هي على النحو التالي في النظام.serviceModel إضافة التالية
<extensions>
<behaviorExtensions>
<add name="federatedServiceHostConfiguration" type="Microsoft.IdentityModel.Configuration.ConfigureServiceHostBehaviorExtensionElement, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</behaviorExtensions>
</extensions>
في إطار الداخل إضافة السطر التالي
<behavior name="serviceBehavior">
<federatedServiceHostConfiguration name="MyService" />
تخميني هو أن لا شيء هو اعتراض الاتصال.إما CurrentPrincipal هو إعادة بحلول الوقت الذي كنت دراسة أو أنت في موضوع مختلف.
التحقق من CurrentPrincipal مباشرة بعد تعيين إلى ذلك ، يجب أن ترى القيمة الصحيحة.