using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Threading.Tasks; using zero.Core.Api; using zero.Web.Models; namespace zero.Web.Filters { public class VerifyTokenAttribute : TypeFilterAttribute { public VerifyTokenAttribute(string key = "model") : base(typeof(VerifyTokenAttributeImpl)) { Arguments = new object[] { key }; } private class VerifyTokenAttributeImpl : IAsyncActionFilter { IToken token; string key; public VerifyTokenAttributeImpl(IToken token, string key) { this.token = token; this.key = key; } public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { if (context.ActionArguments.ContainsKey(key)) { object argument = context.ActionArguments[key]; if (argument is EditModel) { EditModel model = (argument as EditModel); string tokenId = model.Meta?.Token; bool isVerified = await token.Verify(model.Id, tokenId); if (!isVerified) { context.Result = new StatusCodeResult(409); return; } } } await next(); } } } }