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();

浙公网安备 33010602011771号