كيف يمكنني الحصول على خدمة ويب WSE 3.0 لإنتحال هوية موكلي؟

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

سؤال

لدي خدمة ويب ومقرها WSE تعمل في Windows Server 2003 ضمن IIS 6.0. أريد أن تقوم عملية خدمة الويب بإنتحال مستخدم العميل الذي يرسل طلب خدمة الويب، ومع ذلك لا تنطبق الخدمة على العميل.

يحتوي تطبيق الويب على تجمع التطبيقات الخاصة به، والذي يتم تعيينه حاليا قيد التشغيل تحت هوية خدمة الشبكة. تم تمكين حساب Windows Server 2003 Machine للتفويض في Active Directory (على الأقل وفقا لبلدي الرجل). تبدو سياسة الخدمة WSE (في WSE3Policycache.config) مثل هذا:

<policy name="GeneratedServicesPolicy">
    <kerberosSecurity establishSecurityContext="false" renewExpiredSecurityContext="true" requireSignatureConfirmation="false" messageProtectionOrder="SignBeforeEncrypt" requireDerivedKeys="true" ttlInSeconds="300">
        <protection>
            <request signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
            <response signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
            <fault signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
        </protection>
     </kerberosSecurity>
     <requireActionHeader />
</policy>

الخدمة لديها الإدخالات التالية (من بين أمور أخرى) في Web.config:

<identity impersonate="false"/>
<authentication mode="Windows"/>

يتم تمكين الوصول المجهول للتطبيق (مطلوب ذلك منذ عدم استخدام الأمان على مستوى النقل من قبل الخدمة، ورسالة LEVE هي). حساب الجهاز يحتوي على SPN التالية المسجلة:

HOST/RD360-2
HOST/rd360-2.mycompany.com

لدى العميل ما يلي في WSE3Policycache.config:

<policy name="KerbClient">
    <kerberosSecurity establishSecurityContext="false" renewExpiredSecurityContext="true" requireSignatureConfirmation="false" messageProtectionOrder="SignBeforeEncrypt" requireDerivedKeys="true" ttlInSeconds="300">
        <token>
            <kerberos targetPrincipal="HOST/rd360-2.mycompany.com" impersonationLevel="Impersonation" />
        </token>
        <protection>
            <request signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
            <response signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
            <fault signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
        </protection>
    </kerberosSecurity>
    <requireActionHeader />
</policy>

يبدو رمز العميل مثل هذا:

static void Main(string[] args)
{
    AddFloatsWSWse client = new AddFloatsWSWse();
    client.SetPolicy("KerbClient");

    double result = client.AddFloats(2.3, 3.2);
    Console.WriteLine("Result was: '" + result + "'");
}

الخدمة ليست انتحال شخصية هوية موكدي، رغم ذلك. أنا أستخدم log4net في الخدمة، وعندما أطلب منه طباعة %username في سجل تتبع ASP.NET، هو دائما NT AUTHORITY\NETWORK SERVICE وليس معرف مستخدم العميل. هل هناك أي شيء أفعله خطأ؟ هل هناك مكان يمكنني أن أتطلع إليه معرفة ما إذا كان WSE حتى يحاول أداء الانتحال والفشل؟ أرى أن الإدخالات التالية في سجل الأحداث الخاص بي (mydomain و myuser تحجب هنا):

Event Type: Success Audit
Event Source:   Security
Event Category: Privilege Use 
Event ID:   576
Date:       12/9/2009
Time:       11:07:16 AM
User:       MYDOMAIN\MYUSER
Computer:   RD360-2
Description:
    Special privileges assigned to new logon:
        User Name:  MYUSER
        Domain:     MYDOMAIN
        Logon ID:       (0x0,0x4B410AE)
        Privileges: SeSecurityPrivilege
                SeBackupPrivilege
                SeRestorePrivilege
                SeTakeOwnershipPrivilege
                SeDebugPrivilege
                SeSystemEnvironmentPrivilege
                SeLoadDriverPrivilege
                SeImpersonatePrivilege

----------------------------------------------------------------------------------

Event Type: Success Audit
Event Source:   Security
Event Category: Logon/Logoff 
Event ID:   540
Date:       12/9/2009
Time:       11:07:16 AM
User:       MYDOMAIN\MYUSER
Computer:   RD360-2
Description:
    Successful Network Logon:
        User Name:  MYUSER
        Domain:     MYDOMAIN
        Logon ID:   (0x0,0x4B410AE)
        Logon Type: 3
        Logon Process:  Kerberos
        Authentication Package: Kerberos
        Workstation Name:   
        Logon GUID: {OBFUSCATED}
        Caller User Name:   -
        Caller Domain:  -
        Caller Logon ID:    -
        Caller Process ID: -
        Transited Services: -
        Source Network Address: -
        Source Port:    -

وفي ملف Trace WS الذي أراه:

<processingStep description="Entering SOAP filter Microsoft.Web.Services3.Design.RequireSoapHeaderAssertion+RequireSoapHeaderFilter" />
<processingStep description="Exited SOAP filter Microsoft.Web.Services3.Design.RequireSoapHeaderAssertion+RequireSoapHeaderFilter" />
<processingStep description="Entering SOAP filter Microsoft.Web.Services3.Design.KerberosAssertion+ServiceInputFilter" />
<processingStep description="Exited SOAP filter Microsoft.Web.Services3.Design.KerberosAssertion+ServiceInputFilter" />

لذلك أعرف على الأقل أن ملحقات Kerberos تتم معالجة رؤوس Kerberos الخاصة بي.

يحرر: يستخدم WebService الخاص بي ثم مكتبة اتصالات عميل ملكية للاتصال بخادم آخر باستخدام SSPI / IWA (دعنا نسمي هذا الخادم الثالث خادم فو). أريد ذلك استخدام هوية العميل عندما يجعل هذه المكالمة الثانية في خادم FOO. هذا يعني أن مكتبة اتصالات العميل هذه تدعو AcquireCredentialsHandle و InitializeSecurityContext باستخدام SPN لخادم FOO وخدمة مختلفة. في هذه الحالة بالذات، يقوم خادم Foo يعمل بالفعل على نفس الجهاز مثل خدمة WSE Web (لذلك يستخدم SPN mycompany/rd260-2). نظرا لأن هذه القفزة الثانية هي نفس الجهاز، أود أن أستخدم هذا لاستخدام NTLM، لكنه لا يزال ينبغي أن ينتقل هوية مستخدم خدمة الويب الخاص بي، أليس كذلك؟ في سجلات خادم FOO، أرى أنه يقبل الاتصال، يستخدم سياق أمان IWA المقدمة ويخبرني أنه بناء على سياق الأمان هذا، فإن مستخدم الاتصال هو rd36-2$ ما هو حساب الجهاز لأن خدمة WSE WEB قيد التشغيل في IIS تحت هوية خدمة الشبكة (والتي بدورها مرتبطة بحساب الجهاز). في سجلات خادم Foo، بعد أن تتلقى سياق أمان IWA، أريد في النهاية أن أرى هوية المستخدم الذي قدم طلب خدمة الويب. هل سيكون من المفيد نقل خادم FOO إلى جهاز مختلف لمعرفة ما إذا كان هذا يحتوي على بعض بعضها؟

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

المحلول

The Kerberos Token المستخدمة مع WSE 3 هي آلية أمان على مستوى الرسائل وتوافق فقط العميل. لا يغير في الواقع سياق الأمان كما هو الحال في IWA، لذلك لن تلاحظ أي شيء مختلف في سجل التتبع على هذا النحو. من أجل انتحالمان العميل في الواقع، يجب عليك:

  • تمكين الانتحال على الرمز الأمان مع impersonationLevel="Impersonation" على ال <kerberos> العنصر (الذي قمت به بالفعل)؛ و
  • لديك WebMethod الخاص بك إنشاء WindowsImpersonationContext بناء على هوية الرمز المميز.

مثال:

WindowsIdentity identity =
    (WindowsIdentity)RequestSoapContext.Current.IdentityToken.Identity;
WindowsImpersonationContext impersonationContext = null;
try
{
    impersonationContext = identity.Impersonate();

    // Perform your work here
    // ...
}
finally
{
    if (impersonationContext != null)
    {
        impersonationContext.Undo();
    }
}

نصائح أخرى

بقدر ما أستطيع أن أفهم الوضع هو عندما تحاول جعل القفزة الثانية تم إسقاط تذكرة كيربروس. في سيناريو مزدوج هوب، سيتم إسقاط تذكرة Kerberos في قفزة ثانية.

سوف تفشل المصادقة الخاصة بك بعد ذلك ولن تبديل إلى NTLM.

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