- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试重新创建一个 Ajax 版本的 ValidateAntiForgeryToken - 有很多关于如何为以前版本的 MVC 执行此操作的博客文章,但是对于最新的 MVC 6,没有任何代码是相关的。不过,我要遵循的核心原则是让验证查看 __RequestVerificationToken
的 Cookie 和 header 。 ,而不是将 Cookie 与表单值进行比较。我使用的是 MVC 6.0.0-rc1-final、dnx451 框架,所有 Microsoft.Extensions 库都是 1.0.0-rc1-final。
我最初的想法是继承ValidateAntiForgeryTokenAttribute ,但是查看源代码,我需要返回我自己的授权过滤器实现,以让它查看 header 。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class ValidateAjaxAntiForgeryTokenAttribute : Attribute, IFilterFactory, IFilterMetadata, IOrderedFilter
{
public int Order { get; set; }
public bool IsReusable => true;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
return serviceProvider.GetRequiredService<ValidateAjaxAntiforgeryTokenAuthorizationFilter>();
}
}
因此,我制作了自己的 ValidateAntiforgeryTokenAuthorizationFilter 版本
public class ValidateAjaxAntiforgeryTokenAuthorizationFilter : IAsyncAuthorizationFilter, IAntiforgeryPolicy
{
private readonly IAntiforgery _antiforgery;
private readonly ILogger _logger;
public ValidateAjaxAntiforgeryTokenAuthorizationFilter(IAntiforgery antiforgery, ILoggerFactory loggerFactory)
{
if (antiforgery == null)
{
throw new ArgumentNullException(nameof(antiforgery));
}
_antiforgery = antiforgery;
_logger = loggerFactory.CreateLogger<ValidateAjaxAntiforgeryTokenAuthorizationFilter>();
}
public async Task OnAuthorizationAsync(AuthorizationContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (IsClosestAntiforgeryPolicy(context.Filters) && ShouldValidate(context))
{
try
{
await _antiforgery.ValidateRequestAsync(context.HttpContext);
}
catch (AjaxAntiforgeryValidationException exception)
{
_logger.LogInformation(1, string.Concat("Ajax Antiforgery token validation failed. ", exception.Message));
context.Result = new BadRequestResult();
}
}
}
protected virtual bool ShouldValidate(AuthorizationContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
return true;
}
private bool IsClosestAntiforgeryPolicy(IList<IFilterMetadata> filters)
{
// Determine if this instance is the 'effective' antiforgery policy.
for (var i = filters.Count - 1; i >= 0; i--)
{
var filter = filters[i];
if (filter is IAntiforgeryPolicy)
{
return object.ReferenceEquals(this, filter);
}
}
Debug.Fail("The current instance should be in the list of filters.");
return false;
}
}
但是,我找不到包含 IAntiforgeryPolicy 的正确 Nuget 包和命名空间.当我在 GitHub 上找到界面时 - 我在哪个包中找到它?
我的下一次尝试是在 IAntiforgery 注入(inject)之后,替换 DefaultAntiforgery用我自己的AjaxAntiforgery
.
public class AjaxAntiforgery : DefaultAntiforgery
{
private readonly AntiforgeryOptions _options;
private readonly IAntiforgeryTokenGenerator _tokenGenerator;
private readonly IAntiforgeryTokenSerializer _tokenSerializer;
private readonly IAntiforgeryTokenStore _tokenStore;
private readonly ILogger<AjaxAntiforgery> _logger;
public AjaxAntiforgery(
IOptions<AntiforgeryOptions> antiforgeryOptionsAccessor,
IAntiforgeryTokenGenerator tokenGenerator,
IAntiforgeryTokenSerializer tokenSerializer,
IAntiforgeryTokenStore tokenStore,
ILoggerFactory loggerFactory)
{
_options = antiforgeryOptionsAccessor.Value;
_tokenGenerator = tokenGenerator;
_tokenSerializer = tokenSerializer;
_tokenStore = tokenStore;
_logger = loggerFactory.CreateLogger<AjaxAntiforgery>();
}
}
在我停滞不前之前我已经走了这么远,因为 ILoggerFactory
上没有通用方法对于 CreateLogger<T>()
. DefaultAntiforgery
的源代码有Microsoft.Extensions.Options
,但我无法在任何 Nuget 包中找到该命名空间。 Microsoft.Extensions.OptionsModel
存在,但这只会带来 IOptions<out TOptions>
界面。
为了跟进所有这些,一旦我确实让授权过滤器工作,或者我得到了 IAntiforgery
的新实现。 ,在哪里或如何使用依赖注入(inject)注册它以使用它 - 并且仅用于我将接受 Ajax 请求的操作?
最佳答案
我有类似的问题。我不知道 .NET 中是否对此有任何更改,但当时,我在 Startup.cs 中的 ConfigureServices 方法中添加了以下行,在行 services.AddMvc(),以验证通过 Ajax 发送的 AntiForgeryToken:
services.AddAntiforgery(options =>
{
options.CookieName = "yourChosenCookieName";
options.HeaderName = "RequestVerificationToken";
});
AJAX 调用类似于以下内容:
var token = $('input[type=hidden][name=__RequestVerificationToken]', document).val();
var request = $.ajax({
data: { 'yourField': 'yourValue' },
...
headers: { 'RequestVerificationToken': token }
});
然后,只需在您的操作中使用 native 属性 [ValidadeAntiForgeryToken]。
关于c# - 使用 AspNet Core MVC 在 Ajax 请求中验证 AntiForgeryToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36628666/
在同一页面的另一个 View 中成功登录后,我需要在 View 中的表单中重新加载 AntiForgeryToken。 我可以通过 jQuery 使用结果登录页面中的新 key 在表单输入 @Html
我正在尝试防止 CSRF 并有两个场景: 从另一个站点内执行 POST 并且在我启用 AntiForgeryToken 时失败 我已经尝试从我的“恶意”Javascript(在另一个站点上运行)首先执
我正在 MVC 应用程序中实现 CSRF。我创建了自定义属性来验证 token ,因为我的输入是 json 编码并由 Ajax 调用。它在同一项目中工作正常,但当任何按钮或链接在同一解决方案中跨不同项
我正在将安全性应用于我的 .net 3.5 mvc2 Web 应用程序。我的网站不包含任何用户身份验证,并且由 .js 文件中的许多 ajax 调用组成 在我的 .aspx 文件中我写道 在我的
我知道 CSRF 的基础知识和 AntiForgeryToken . 我也知道有很多类似的questions周围但似乎没有描述实现细节,这是我感兴趣的部分。 每次调用 Html.AntiForgery
这个问题在这里已经有了答案: how AntiForgeryToken() works in MVC and how to retrieve value at server action metho
我在 ASP.NET Core 2.2 中使用 IdentityServer4。在登录后方法上,我应用了 ValidateAntiForgeryToken。通常在登录页面上停留 20 分钟到 2 小时
我有一个带有 AntiForgeryToken 表单的布局页面 using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl
我目前正在ASP.net中开发MVC应用程序。我正在使用AJAX.ActionLink在记录列表中提供删除链接,但是这是非常不安全的。我把这个: 在函数上执行删除操作,这将阻止仅通过URL调用该函数
我正在开发一个使用 asp.net core2 和 Angular 运行的网络 API 应用程序。详细的开发环境配置为here .我正在尝试配置 AntiForgeryToken 验证,但它一直失败。
我的流程非常简单;用户使用登录表单登录。登录表单执行一个帖子,并定义一个 @Html.AntiForgeryToken。在服务器上,操作方法定义[ValidateAntiForgeryToken]来验
我有一个场景,我不需要发送表单数据,但需要通过 ajax 调用发送一些其他数据。我有一个包含 html.AntiForgeryToken() 的表单。 这是我尝试过的。 var modid = $("
在我部署一些在测试中似乎有效的代码之前,使用 AntiForgeryToken 是否存在任何问题?部署到 Azure WebRole 时。因为它生成一些 html 和 cookie,所以我担心以下..
我发布这个是因为这让我们忙了一天,而且我们在 Internet 上找不到任何关于这个解决方案的信息,所以这是为了节省人们以后的时间。这是问题: 如果您的 View 中有一个 @Html.AntiFor
我正在使用 AntiForgeryToken 辅助方法。据我了解,AntiForgeryToken 是基于 session 的,因此每个用户都具有相同的 token ,但另一个用户将具有不同的 tok
有人可以告诉我更多关于它的细节吗? 最佳答案 基本上,防伪 token 会阻止任何人向您的站点提交由并非由实际用户生成的恶意脚本生成的请求。有一个 HTTP only cookie(不能被浏览器中运行
我在让 Microsoft 的 MVC 的 [ValidateAntiForgeryToken] 与使用 Marionette & Backbone 编写的单页应用程序 (SPA) 配合使用时遇到问题
AntiForgeryToken 是否应该应用于 ASP.NET MVC 应用程序中的每个后操作?我完全想不出您不想在每个后期操作中包含此内容的任何原因,但似乎没有人真正建议在您的所有操作中使用它。
我有一个用户可以在不登录的情况下发布的表单。但是,如果他的电子邮件被识别,则需要密码。密码表单通过 Ajax 进行验证,如果成功,则提交主表单。两种形式都需要有效的 AntiForgeryToken。
我感兴趣为什么不是 AntiForgeryToken默认情况下包含在每个 ASP.NET MVC 表单中?似乎总是包含它的好处大于可能的缺点。如果需要,可以禁用此行为,例如 Web 表单 HttpRe
我是一名优秀的程序员,十分优秀!