Как создать экземпляр 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()"?