ASP.Net خدمة WCF هذا الموضوع.CurrentPrincipal يتم القاؤها من قبل بعض اعتراضية في ميكرونيزيا (WIF) البيئة

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

  •  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 مباشرة بعد تعيين إلى ذلك ، يجب أن ترى القيمة الصحيحة.

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