面试题答案
一键面试生成令牌
- 选择加密算法:
通常可以使用如 HMAC - SHA256 这样的哈希算法。在 Visual Basic 中,可以利用
System.Security.Cryptography
命名空间下的类。例如:
Imports System.Security.Cryptography
Imports System.Text
Public Function GenerateToken(ByVal secretKey As String, ByVal payload As String) As String
Dim keyBytes As Byte() = Encoding.UTF8.GetBytes(secretKey)
Dim messageBytes As Byte() = Encoding.UTF8.GetBytes(payload)
Using hmacSha256 As HMACSHA256 = New HMACSHA256(keyBytes)
Dim hashBytes As Byte() = hmacSha256.ComputeHash(messageBytes)
Return Convert.ToBase64String(hashBytes)
End Using
End Function
这里的 payload
可以包含用户标识、过期时间等信息,以 JSON 格式字符串传递。
验证令牌
- 接收并解析令牌:
从客户端请求的 HTTP 头(如
Authorization
头,格式通常为Bearer {token}
)中获取令牌。
Dim token As String = Request.Headers("Authorization").Substring(7) '去掉 "Bearer " 前缀
- 重新生成令牌进行对比:
使用相同的密钥和原始
payload
(可从数据库或之前存储的信息中获取,需要包含过期时间等验证信息)重新生成令牌,并与客户端传递的令牌对比。
Dim storedPayload As String = GetStoredPayloadFromDB(userID) '假设此函数从数据库获取原始 payload
Dim secretKey As String = GetSecretKeyFromConfig() '假设此函数从配置获取密钥
Dim generatedToken As String = GenerateToken(secretKey, storedPayload)
If generatedToken = token Then
'令牌验证成功
Else
'令牌验证失败
End If
同时,还需要检查令牌中的过期时间是否已过:
Dim json As JObject = JObject.Parse(storedPayload)
Dim expiration As DateTime = json("expiration").ToObject(Of DateTime)
If expiration < DateTime.Now Then
'令牌已过期
End If
服务端代码集成认证机制
- 中间件或通用验证函数: 可以创建一个通用的验证函数,在每个需要认证的资源请求处理前调用。
Public Function IsAuthorized(ByVal token As String) As Boolean
'验证逻辑,如上述验证令牌步骤
Return True '验证成功返回 True,否则返回 False
End Function
- 在资源处理函数中调用: 例如,在处理获取用户信息的 API 时:
<WebMethod>
Public Function GetUserInfo() As String
Dim token As String = Request.Headers("Authorization").Substring(7)
If IsAuthorized(token) Then
'处理获取用户信息逻辑
Return "User information"
Else
Return "Unauthorized"
End If
End Function
- 全局过滤器(如果适用):
对于使用 ASP.NET Web API 等框架的 Visual Basic 项目,可以设置全局过滤器,对所有符合条件的请求进行令牌验证,避免在每个 API 方法中重复编写验证代码。例如在
Global.asax
文件中:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
GlobalConfiguration.Configuration.Filters.Add(New TokenAuthenticationFilter())
End Sub
其中 TokenAuthenticationFilter
类实现了 IActionFilter
接口,在 OnActionExecuting
方法中进行令牌验证逻辑。