Azure service fabric 如何将声明/JWT传递给服务结构无状态服务?

Azure service fabric 如何将声明/JWT传递给服务结构无状态服务?,azure-service-fabric,Azure Service Fabric,服务结构无状态服务是否支持基于索赔的授权 假设我有一个web api,它在头中接收JWT。我是否可以将JWT或中的声明传递给服务结构无状态服务,以便它在执行敏感操作之前可以对声明进行一些检查 我可以看出,我们可以使用ClaimsCredentials将索赔传递给服务: var serviceProxyFactory = new ServiceProxyFactory( (callbackClient) => new FabricTransportServiceRemotingCli

服务结构无状态服务是否支持基于索赔的授权

假设我有一个web api,它在头中接收JWT。我是否可以将JWT或中的声明传递给服务结构无状态服务,以便它在执行敏感操作之前可以对声明进行一些检查

我可以看出,我们可以使用ClaimsCredentials将索赔传递给服务:

var serviceProxyFactory = new ServiceProxyFactory(
    (callbackClient) => new FabricTransportServiceRemotingClientFactory(
        new FabricTransportSettings
        {
            SecurityCredentials = new ClaimsCredentials
            {
                LocalClaims = "[JWT HERE? or just Claims JSON?]"
            }
        }));

IMyService service = serviceProxyFactory.CreateServiceProxy<IMyService>(new Uri("fabric:/MyThing/MyService"));
var serviceProxyFactory=新serviceProxyFactory(
(callbackClient)=>新的FabricTransportServiceRemotingClientFactory(
新的FabricTransportSettings
{
SecurityCredentials=新的债权Credentials
{
LocalClaims=“[JWT在这里?还是只声明JSON?]”
}
}));
IMyService service=serviceProxyFactory.CreateServiceProxy(新Uri(“结构:/MyThing/MyService”);
表示LocalClaims是“从STS(安全令牌服务)获取的声明令牌的字符串表示形式。”

此外:

  • ClaimsCredentials实际上是base64编码的JWT,还是仅仅是claim key:value属性的JSON负载

  • 在无状态服务中是否需要执行任何特定的配置或代码

  • 如何从无状态服务访问声明

此时,当我调用该服务时,无论我将LocalClaims设置为什么值,都会出现以下错误:

System.Fabric.FabricCannotConnectException: Error in Connection during ServiceCommunication 
 ---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80071C4C\r\n   
 at Microsoft.ServiceFabric.Services.Communication.FabricTransport.Common.NativeServiceCommunication.IFabricServiceCommunicationClient2.EndRequest(IFabricAsyncOperationContext context)\r\n   
 at Microsoft.ServiceFabric.Services.Communication.FabricTransport.Client.NativeServiceCommunicationClient.EndRequest(IFabricAsyncOperationContext context)\r\n   at System.Fabric.Interop.AsyncCallOutAdapter2`1.Finish(IFabricAsyncOperationContext context, Boolean expectedCompletedSynchronously)\r\n   --- End of inner exception stack trace ---\r\n   
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   
 at Microsoft.ServiceFabric.Services.Communication.FabricTransport.Client.NativeServiceCommunicationClient.<RequestResponseAsync>d__8.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.ServiceFabric.Services.Communication.Client.ServicePartitionClient`1.<InvokeWithRetryAsync>d__7`1.MoveNext()
System.Fabric.FabricCannotConnectException:服务通信期间连接出错
--->System.Runtime.InteropServices.ComeException:来自HRESULT的异常:0x80071C4C\r\n
位于Microsoft.ServiceFabric.Services.Communication.FabricTransport.Common.NativeServiceCommunication.IFABricServiceCommunicationClient 2.EndRequest(IFabricAsyncOperationContext上下文)\r\n
位于Microsoft.ServiceFabric.Services.Communication.FabricTransport.Client.NativeServiceCommunicationClient.EndRequest(IFabricAsyncOperationContext上下文)\r\n位于System.Fabric.Interop.AsyncCallOutAdapter2`1.Finish(IFabricAsyncOperationContext,布尔值expectedCompletedSynchronously)\r\n---内部异常堆栈跟踪的结束---\r\n
在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)时\r\n
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中\r\n
在Microsoft.ServiceFabric.Services.Communication.FabrictTransport.Client.NativeServiceCommunicationClient.d_8.MoveNext()\r\n--从引发异常的上一个位置开始的堆栈结束跟踪----\r\n在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务任务)中\r\n位于Microsoft.ServiceFabric.Services.Communication.Client.ServicePartitionClient`1.d__7`1.MoveNext()的System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n

谢谢

我不认为
ClaimsCredentials
类旨在携带JWT令牌,而是由服务结构本身根据某种证书生成的安全令牌。如果检查类
ClaimsCredentials
,您会发现它与承载索赔信息的本机类紧密相关。深入挖掘,发现用于传递信息的结构:

[StructLayout(LayoutKind.Sequential,Pack=8)]
内部结构结构\u声明\u凭据
{
公共uint服务器CommonNameCount;
公共IntPtr服务器公共名称;
公共单位发行人;打印计数;
公共IntPtr发行人;
公共IntPtr本地索赔;
公共国家类型。结构保护级别保护级别;
保留公共IntPtr;
}
[StructLayout(LayoutKind.Sequential,Pack=8)]
内部结构结构\u声明\u凭据\u EX1
{
公共uint服务器ThumbPrintCount;
公共IntPtr服务器指纹;
保留公共IntPtr;
}
关于这个类,有很多内容是内部的,没有任何东西表明与JWTs有任何关系,也没有任何对JWTs的理解

如果您想在HTTP端点中添加某种形式的安全性,那么您应该能够使用
System.IdentityModel.Tokens.JwtSecurityTokenHandler
,请查看以下内容,以便开始回答:


如果要将基于JWT的安全性添加到Fabric Transport端点,则可能需要使用将JWT添加为客户端中的自定义头,然后在侦听器上解析和验证该头。对于这种传输思想,使用提供的和有文档记录的安全模型对X509证书进行服务远程处理可能是一个更好的选择。

我不认为
ClaimsCredentials
类旨在携带JWT令牌,而是由服务结构本身根据某些证书生成的安全令牌。如果检查类
ClaimsCredentials
,您会发现它与承载索赔信息的本机类紧密相关。深入挖掘,发现用于传递信息的结构:

[StructLayout(LayoutKind.Sequential,Pack=8)]
内部结构结构\u声明\u凭据
{
公共uint服务器CommonNameCount;
公共IntPtr服务器公共名称;
公共单位发行人;打印计数;
公共IntPtr发行人;
公共IntPtr本地索赔;
公共国家类型。结构保护级别保护级别;
保留公共IntPtr;
}
[StructLayout(LayoutKind.Sequential,Pack=8)]
内部结构结构\u声明\u凭据\u EX1
{
公共uint服务器ThumbPrintCount;
公共IntPtr服务器指纹;
保留公共IntPtr;
}
关于这个类,有很多内容是内部的,没有任何东西表明与JWTs有任何关系,也没有任何对JWTs的理解

如果您想在HTTP端点中添加某种形式的安全性,那么您应该能够使用
System.IdentityModel.Tokens.JwtSecurityTokenHandler
,请查看以下内容,以便开始回答:

如果您想将基于JWT的安全性添加到结构传输端点,那么