WCF JWT Token验证例子

安装必要的 NuGet 包

Install-Package System.IdentityModel.Tokens.Jwt
Install-Package Microsoft.IdentityModel.Protocols.OpenIdConnect

 

创建一个自定义的MessageInspector

using System;
using System.IdentityModel.Tokens.Jwt;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public class JwtTokenInspector : IClientMessageInspector, IDispatchMessageInspector
{
private readonly string _tokenValidationKey;
private readonly string _issuer;
private readonly string _audience;

public JwtTokenInspector(string tokenValidationKey, string issuer, string audience)
{
_tokenValidationKey = tokenValidationKey;
_issuer = issuer;
_audience = audience;
}

public void AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) { }

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var token = "你的JWT令牌"; // 从客户端传递或其他方式获取JWT令牌
ValidateJwtToken(token);
return null; // 可以返回一个自定义的对象,例如用户信息等,供后续使用。
}

public void AfterReceiveReply(ref Message reply, object correlationState) { }

public void BeforeSendReply(ref Message reply, object correlationState) { }

private void ValidateJwtToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = _issuer,
ValidAudience = _audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenValidationKey))
};
SecurityToken validatedToken;
var principal = tokenHandler.ValidateToken(token, tokenValidationParameters, out validatedToken);
if (!principal.Identity.IsAuthenticated) throw new SecurityTokenException("Invalid token.");
}
}

 

注册自定义的MessageInspector到WCF服务端或客户端配置中

var tokenValidationKey = "你的密钥"; // 用于签名的密钥,需要与生成JWT时使用的密钥一致。
var issuer = "你的发行者"; // JWT的发行者标识,与生成JWT时一致。
var audience = "你的受众"; // JWT的受众标识,与生成JWT时一致。
var inspector = new JwtTokenInspector(tokenValidationKey, issuer, audience);

 

服务端修改:

var serviceHost = new ServiceHost(typeof(YourServiceType)); // 初始化你的服务宿主。
serviceHost.AddDefaultEndpoints(); // 添加默认端点。
serviceHost.Description.Behaviors.Add(new ServiceBehaviorAttribute { InstanceContextMode = InstanceContextMode.Single }); // 设置实例上下文模式。
serviceHost.EndpointBehaviors.Add(new ServiceAuthorizationBehavior()); // 添加服务授权行为。
serviceHost.EndpointBehaviors.Add(new DispatchOperationBehavior()); // 添加操作行为。
serviceHost.EndpointBehaviors.Add(new DispatchOperationBehavior()); // 添加操作行为。
serviceHost.AddServiceEndpoint(typeof(IYourServiceContract), new WebHttpBinding(), ""); // 添加服务端点。
serviceHost.Open(); // 打开服务宿主。

 

客户端调用

var clientChannelFactory = new ChannelFactory<IYourServiceContract>(new WebHttpBinding(), new EndpointAddress("http://your-service-url")); // 创建客户端通道工厂。
clientChannelFactory.Endpoint.Behaviors.Add(new ClientOperationBehavior()); // 添加客户端操作行为。
var clientChannel = clientChannelFactory.CreateChannel();

posted @ 2025-06-16 15:18  modentime  阅读(22)  评论(0)    收藏  举报