Как создать экземпляр OperationContext.Current при запуске внутри независимой Задачи внутри Сервера WCF?

У меня есть служба WCF, выполняющая задачу, прослушивающую RS-232 (последовательные) сообщения, поступающие от стороннего робота (автомата). Эта задача создается из файла global.asax.cs во время запуска WCF (метод Global.Application_Start()), поэтому она не связана ни с одним клиентским запросом.

Проблема заключается в том, что когда я получаю сообщение от линии RS-232, мне нужно вызвать открытый метод WCF, который украшен некоторыми атрибутами PrincipalPermission, чтобы требовать роли пользователя:

[PrincipalPermission(SecurityAction.Demand, Role = "RoleName")
public OrderOperationResult Order(string parameters) {}

Поэтому я пытаюсь установить роль пользователя, создав объект OperationContext.Current (который имеет значение null). Я много искал и не мог найти способ сделать это.

Например, я не могу использовать платформы Moq и WcfMock, поскольку это не для целей тестирования в режиме отладки (невозможно установить псевдоним OperationContext во время производства).

Пока что я написал этот код ниже, который даже не компилируется:

    List<System.Security.Claims.Claim> claims = new List<System.Security.Claims.Claim>();
    claims.Add(new System.Security.Claims.Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "SomeName"));
    claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "1234567890"));
    claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "RoleName"));

    List<System.Security.Claims.ClaimsIdentity> claimsCollection = new List<System.Security.Claims.ClaimsIdentity>();
    ClaimsIdentity identity = new System.Security.Claims.ClaimsIdentity(claims, "Test"); // specify authentication type here!!
    claimsCollection.Add(identity);

    // Not sure we need to set the Thread.CurrentPrincipal variable:
    System.Security.Claims.ClaimsPrincipal new_principal = new System.Security.Claims.ClaimsPrincipal(claimsCollection);
    Thread.CurrentPrincipal = new_principal;


    var channel = new SomeClass(); // <-- What to put here?

    OperationContext.Current = new OperationContext(channel);

    //Assign roles to the Principal property for runtime to match with PrincipalPermissionAttributes decorated on the service operation.
    var roleNames = new String[] { "RoleName" };
    OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties["Principal"] = new GenericPrincipal(identity, roleNames);

    // Instantiate the WCF Service implementation class:
    FtShopService shopService = new FtShopService();

    // And call the public WCF method:
    OrderOperationResult innerResult = shopService.Order(parameters); // Raises Exception complaining the current user is missing demanded roles.

Знаете ли вы какой-либо способ подделать текущую роль пользователя в запросе, чтобы я мог вызвать метод "Order()"?

0 ответов

Другие вопросы по тегам