المطالبات هي خالية عندما تصل إلى خدمة WCF

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

  •  27-09-2019
  •  | 
  •  

سؤال

أقوم حاليًا بتنفيذ حل مصادقة اتحادي باستخدام: STS السلبي لإصدار الرموز ، وموقع ويب يستضيف تطبيق Silverlight وخدمات WCF لتطبيق Silverlight.

حتى الآن أنا قادر:

  • الحصول على إعادة توجيه إلى STS
  • تسجيل الدخول والحصول على إعادة توجيه إلى الموقع
  • عرض المطالبات على الموقع الإلكتروني عن طريق الوصولHttpContext.Current.User.Identity as IClaimsIdentity;

على الويب.

<modules runAllManagedModulesForAllRequests="true">

        <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/>
        <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/>

    </modules>

لقد قمت أيضًا بتكوين قسم microsoft.identityModel في web.config لاستخدام تنفيذي الخاص لـ PlaySauthenticationManager و PlantSathorizationManager.

<service name="Rem.Ria.PatientModule.Web.WebService.PatientService">
        <claimsAuthenticationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthenticationManager"/>
        <claimsAuthorizationManager type ="Rem.Infrastructure.WIF.RemClaimsAuthorizationManager"/>
      </service>

إن PrintSauthenticationManager هو ببساطة وضع الموضوع. يتم توفير رأس صادر.

class RemClaimsAuthenticationManager : ClaimsAuthenticationManager
    {
        public override IClaimsPrincipal Authenticate ( string resourceName, IClaimsPrincipal incomingPrincipal )
        {

            if ( incomingPrincipal.Identity.IsAuthenticated )
            {
                Thread.CurrentPrincipal = incomingPrincipal;
            }
            return incomingPrincipal;
        }
    }
}

المشكلة هي أنه عندما يتم استدعاء ادعاءات uuthuuthorizationManager ، فإن السياق.

أيه أفكار؟

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

المحلول

لا تحتاج إلى تعيين thread.currentPrincipal لأن وحدة الجلسة ستقوم بذلك نيابة عنك. ستحتاج إلى الوصول إليها من خلال httpcontext.current.user لأن الموضوع. يتم تعيينه على مؤشر ترابط مختلف عن الموصل الذي يصل إلى خدمتك لأنه يوجد وحدتان مختلفتان في IIS. لدينا مثال على ذلك في كتابنا القادم الذي يمكنك الاطلاع عليه على موقع codeplex.

HTH

نصائح أخرى

يعرض رمز العينة التالي فئة عينة ترث المطالبة. إنه يتلقى فقط ICALIDSPRINCIPAL وينتقل من خلال المطالبات ، باستثناء مطالبة الاسم ، والتي يتم تعديلها. هذا لا يضبط CurrentPrincipal على الخيط الحالي ، كما في مثالك.

تنفيذ الاختبار الخاص بي على النحو التالي:

public class CustomClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public CustomClaimsAuthenticationManager()
{

}

public override IClaimsPrincipal Authenticate(string resourceName, 
IClaimsPrincipal   incomingPrincipal)
{
    var outgoingIdentity = GetClaimsAsPassthrough(incomingPrincipal);
    return outgoingIdentity; 
}

private IClaimsPrincipal GetClaimsAsPassthrough(IClaimsPrincipal incomingPrincipal)
{
    if (!incomingPrincipal.Identity.IsAuthenticated)
    {
        return incomingPrincipal; 
    }

    var ingoingClaims = incomingPrincipal.Identity as IClaimsIdentity; 

    ClaimsIdentity outgoingIdentity = new ClaimsIdentity(new List<Claim>
    {
        new Claim(ClaimTypes.Name, (incomingPrincipal.Identity.Name + " 
        a very cool guy"))
    }, incomingPrincipal.Identity.AuthenticationType);

    foreach (var claim in ingoingClaims.Claims.Where(
    c => c.ClaimType != ClaimTypes.Name))
    {
        outgoingIdentity.Claims.Add(claim.Copy()); 
    }

    return new ClaimsPrincipal(new List<ClaimsIdentity> { outgoingIdentity }); 
 }

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