【发布时间】:2022-11-15 17:44:15
【问题描述】:
我想知道在绕过 HTTP 中的 CORS 和/或引荐来源网址检查时,由于缺乏更好的术语,“域操作”是否是真实的。
现在我们的团队正在开发一个公共信息站点,该站点可以从我们的 SQL Server 数据库中动态提取内容。没有登录;从技术上讲,所有用户都是“匿名的”。
该站点本身是静态 HTML、CSS 和 jQuery,但在 .NET 项目/应用程序 (IIS 10.0) 中运行。为获取内容数据而调用的 API 在分离.NET Web API 应用程序和应用程序池。
我们正在使用机器对机器的 JWT 身份验证从站点访问 API;对于使用的每个 API,每次回收/启动应用程序池时,都会向我们的 Auth0 租户发送一个新的令牌请求,返回一个 access_token 并存储在 Application 变量中。这对我们很有效。
'from Application_Start in global.asax.vb ("apiHlpr" is a custom class):
'. . .
For Each apiName As String In apiNameList '<-- pulls specific keys from <appSettings>
Dim tkn As String = apiHlpr.GetSignedJWT(apiName, clientID, clientSec)
tkn = "Bearer " & tkn
Application.Add("keyPrefix_" & apiName, tkn)
Next
为了进一步加强访问限制,我们使用 Web 服务对令牌进行加密,然后将令牌通过请求标头传递给 API……
'snippet from our asmx webservice ("ourLibrary" is a custom class library):
<WebMethod()>
Public Function tkn(ByVal name As String) As Object
Dim authBearer As String = HttpContext.Current.Application("keyPrefix_" & name).ToString.Trim()
Dim strHlpr As New ourLibrary.StringHelper
authBearer = strHlpr.EncryptString(authBearer)
Dim token As New With {
.bearer = authBearer
}
Return token
End Function
...首先检查 HttpContext.Current.Request.UrlReferrer 是否以我们网站的域开头;如果是,则令牌在服务器端解密,然后进行验证。这也很有效。
'snippet from our API's controller ("strHlpr" and "apiHlpr" are custom classes):
Dim token As String = auth.BearerToken()
If auth.ValidReferrer(HttpContext.Current.Request.UrlReferrer) Then
token = strHlpr.DecryptString(token)
End If
Dim status As String = apiHlpr.ValidateToken(token)
'''proceed with validation and retrieve data if validated...
'from auth.vb:
Public Function ValidReferrer(ByVal ref As Uri) As Boolean
If Not IsNothing(ref) Then
Dim str As String = ref.ToString
Dim domain As String = AppSettings("DOMAINGOESHERE").Trim()
If str.ToLower.StartsWith(domain) Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function
结果:
- 当从站点调用 API 时,内容被成功检索,并且...
- 进入浏览器的网络选项卡尝试抓取
access_token,用户将看到加密的字符串而不是未加密的令牌 - 当尝试直接转到 API 请求 url 时,无论是通过不同域中的超链接、直接复制粘贴输入到浏览器中,还是通过 Postman(尝试将加密字符串粘贴到“授权”标头中),a返回 401(未授权)错误——这当然很好。
然而...如果我们要推进这项技术,和/或实施 CORS,我们会遇到一个棘手的问题,到目前为止,我在所有搜索中都没有看到完整的答案:
是什么阻止某人创建自己的带有 API 网址链接的页面,然后自定义他们的本地主机文件,以便他们的页面具有我们站点的域,从而通过他们的“虚拟页面”访问我们的数据?
【问题讨论】:
标签: .net api jwt cors referrer