寻求针对Azure API-Management网关的X-CSRF模式实现文档
针对Azure API Management网关本身的X-CSRF实现说明
目前Azure API Management(APIM)本身没有专门针对自身网关的独立X-CSRF令牌生成与验证官方文档,但可通过APIM内置策略组合实现X-CSRF保护机制,核心实现思路如下:
生成并返回CSRF令牌:
客户端首次发起GET/HEAD等安全请求时,结合<generate-random-string>或Guid生成随机令牌,将令牌存入APIM缓存或客户端Cookie,同时在响应头返回该令牌。验证CSRF令牌:
针对POST/PUT/DELETE等修改类请求,通过<choose>条件判断配合变量取值,检查请求头中的CSRF令牌是否与缓存或Cookie中的令牌一致,不一致则直接返回403拒绝请求。核心策略示例:
生成令牌的策略片段:<choose> <when condition="@(context.Request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase))"> <set-variable name="csrfToken" value="@(Guid.NewGuid().ToString())" /> <set-header name="X-CSRF-Token" exists-action="override"> <value>@((string)context.Variables["csrfToken"])</value> </set-header> <set-cookie name="X-CSRF-Token" exists-action="override"> <value>@((string)context.Variables["csrfToken"])</value> <path>/</path> <secure>true</secure> <http-only>false</http-only> </set-cookie> </when> </choose>验证令牌的策略片段:
<choose> <when condition="@(!context.Request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase) && !context.Request.Method.Equals("HEAD", StringComparison.OrdinalIgnoreCase))"> <set-variable name="requestCsrfToken" value="@(context.Request.Headers.GetValueOrDefault("X-CSRF-Token", ""))" /> <set-variable name="cookieCsrfToken" value="@(context.Request.Cookies.GetValueOrDefault("X-CSRF-Token", ""))" /> <choose> <when condition="@(!string.Equals((string)context.Variables["requestCsrfToken"], (string)context.Variables["cookieCsrfToken"], StringComparison.OrdinalIgnoreCase))"> <return-response> <set-status code="403" reason="Forbidden" /> <set-body>Invalid CSRF token</set-body> </return-response> </when> </choose> </when> </choose>
实际落地时需根据业务场景调整,比如令牌存储方式(可改用APIM外部缓存)、过期时间设置等。
内容的提问来源于stack exchange,提问作者chaitanya kumar Dondapati
相关产品推荐
相关产品推荐

