AntiForgery令牌使用ASP.NET5 Web API而不使用NET46上的System.Web.Helpers

时间:2015-04-16 15:59:33

标签: asp.net asp.net-mvc asp.net-web-api owin antiforgerytoken

尝试在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中检索这些令牌

其他来源ASP.NET5 AntiForgery Source Code

3 个答案:

答案 0 :(得分:3)

在Controller

生成
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