我正在尝试将此方法转换为 F#
private static bool VerifySignedJwt(ECDsa eCDsa, string token) {
var tokenHandler = new JwtSecurityTokenHandler();
var claimsPrincipal = tokenHandler.ValidateToken(token, new TokenValidationParameters {
ValidIssuer = "me",
ValidAudience = "you",
IssuerSigningKey = new ECDsaSecurityKey(eCDsa)
}, out var parsedToken);
return claimsPrincipal.Identity.IsAuthenticated;
}
我正在翻译斯科特·布雷迪(Scott Brady)的这篇伟大作品,以便为Web应用程序创建和验证JWT令牌,创建部分顺利进行。关于验证部分和对 JwtSecurityTokenHandler.ValidateToken 方法中所需的 byref 的引用让我感到困惑。 https://www.scottbrady91.com/C-Sharp/JWT-Signing-using-ECDSA-in-dotnet-Core
如果我按照下面的Microsoft文档进行操作;我收到一个错误,说"类型实例化涉及 byref 类型。这是普通IL规则所不允许的。 尝试将 byref 声明为:
let _h (x: byref<'T>) = ()
https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/byrefs 我已经阅读了关于byrefs的Microsoft文档,但我想知道这是否与.Net核心或F#4.5有关,或者dotnet核心是否取代了F#4.5中的所有功能,包括byrefs? 无论哪种方式,我似乎根本无法实例化安全令牌, "out var parsedToken"是一种SecurityToken类型,更不用说用作此第三方库输出的byref类型了,或者我似乎无法在调用JwtSecurityTokenHandler.ValidateToken时直接声明byref SecurityToken。
如果我使用此帖子中发布的建议 将 C# 委托与 f# 函数结合使用
let function_1 (x:double) (y:double byref) =
y <- 6.0
我收到同样的错误 "类型实例化涉及 byref 类型。这是普通IL规则所不允许的。
我以前在 F# 中使用过 Byrefs,但这些都是简单的整数类型,可以正常工作。 我的项目是.Net core 2.1
任何帮助表示赞赏。
由于ValidateToken()
调用中的out
参数是最后一个参数,因此您可以简单地省略它,并将其视为第二个返回值:
let claimsPrincipal, parsedToken = tokenHandler.ValidateToken (token, tvp)
(这里tvp
将是你的TokenValidationParameters
实例。
有关更多信息,另请参阅 https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/parameters-and-arguments#passing-by-reference。
编辑:由于您似乎没有使用第二个返回值,我认为您的函数可能如下所示:
let verifySignedJwt ecdsa token =
let tokenHandler = JwtSecurityTokenHandler ()
let tvp = TokenValidationParameters (ValidIssuer = "me",
ValidAudience = "you",
IssuerSigningKey = ECDsaSecurityKey ecdsa)
let claimsPrincipal, _ = tokenHandler.ValidateToken (token, tvp)
claimsPrincipal.Identity.IsAuthenticated
另一种选择(不一定更好)是这样的:
let mutable parsedToken = initialValue
let claimsPrinciple = tokenHandler.ValidateToken(token, tvp, &parsedToken)
// something with both
如果您有多个byref
参数,或者最后没有单个byref
参数的模式,则上述内容很有用。