尝试在ASP.NET5 (又名vNext) API上实现AntiForgery
我找到的所有文章都来自this article并使用 System.Web.Helpers.AntiForgery.GetTokens ,这不应该是ASP.NET5的方式
private static string GetTokenHeaderValue()
{
string cookieToken, formToken;
System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;
}
是否有任何实现实际显示如何在ASP.NET5中检索这些令牌
答案 0 :(得分:3)
using Microsoft.AspNet.Mvc;
using Microsoft.Framework.DependencyInjection;
namespace MyApp.App.Controllers
{
public class MyController : Controller
{
public string GetAntiForgeryTokens()
{
var antiForgery = Context.RequestServices.GetService<AntiForgery>();
AntiForgeryTokenSet antiForgeryTokenSet = antiForgery.GetTokens(Context, null);
string output = antiForgeryTokenSet.CookieToken + ":" + antiForgeryTokenSet.FormToken;
return output;
}
}
}
@inject AntiForgery antiForgery
@functions
{
public string GetAntiForgeryTokens()
{
AntiForgeryTokenSet antiForgeryTokenSet = antiForgery.GetTokens(Context, null);
string output = antiForgeryTokenSet.CookieToken + ":" + antiForgeryTokenSet.FormToken;
return output;
}
}
<body>
@GetAntiXsrfToken()
</body>
var antiForgery = Context.RequestServices.GetService<AntiForgery>();
antiForgery.Validate(Context, new AntiForgeryTokenSet(formToken, cookieToken));
答案 1 :(得分:2)
现在有一个sample in the source code。该示例使用Angular 1.x.在该样本的基础上,通过使用过滤器进行验证,这是一个粗略的例子。在public void Configure(IApplicationBuilder app, IAntiforgery antiforgery)
{
app.Use(next => context =>
{
if (!context.Request.Path.Value.StartsWith("/api/"))
{
// We can send the request token as a JavaScript-readable cookie, and Angular will use it by default.
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
}
return next(context);
});
…
}
,需要设置令牌:
public class AntiforgeryValidationFilter : IAsyncActionFilter
{
private readonly IAntiforgery antiforgery;
public AntiforgeryValidationFilter(IAntiforgery antiforgery)
{
this.antiforgery = antiforgery;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (context.HttpContext.Request.Path.Value.StartsWith("/api/"))
{
await antiforgery.ValidateRequestAsync(context.HttpContext);
}
await next();
}
}
然后可以使用过滤器来验证令牌:
Startup
然后在public void ConfigureServices(IServiceCollection services)
{
// Angular's default header name for sending the XSRF token.
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
services
.AddMvc(options =>
options.Filters.Add(typeof(AntiforgeryValidationFilter)))
…
}
注册过滤器:
import sys,os,os.path
sys.path.append(os.path.expanduser('~/code/eol_hsrl_python'))
os.environ['HSRL_INSTRUMENT']='gvhsrl'
os.environ['HSRL_CONFIG']=os.path.expanduser('~/hsrl_config')
答案 2 :(得分:0)
使用MVC实现此功能的另一种方法是使用HTML帮助程序在视图上获取令牌,该令牌创建cookie和隐藏输入字段令牌。
<form>
@Html.AntiForgeryToken()
</form>
HTML输出:
<input name="__RequestVerificationToken" type="hidden" value="*** />
现在表单标记存在,我们可以在标头中发送标记或将其添加到API期望的模型中。可以使用ActionFilter保护API,该ActionFilter处理自定义Antiforgery令牌验证。类似于[授权]的工作原理
[ValidateAntiForgeryToken]
public class MyController : ApiController
逻辑是读取可以找到cookie和标头值标记的标头。然后可以使用
调用来评估AntiForgery.Validate(cookieToken, headerToken);
然后,过滤器可以接受或拒绝该请求。
通过返回拒绝:
HttpStatusCode.Forbidden