gpt4 book ai didi

NancyFx RequiresAuthentication 扩展返回 303 而不是 403

转载 作者:行者123 更新时间:2023-12-01 11:22:04 25 4
gpt4 key购买 nike

我不确定是我做错了什么还是存在某种错误。如果这是一个错误,那么我认为这会立即出现。无论哪种方式:

我在此处使用扩展方法 RequiresAuthentication:

https://github.com/NancyFx/Nancy/blob/9d3c650575cba109e620ab163f4fda26a0536036/src/Nancy/Security/ModuleSecurity.cs

使用 SecurityHooks

https://github.com/NancyFx/Nancy/blob/9d3c650575cba109e620ab163f4fda26a0536036/src/Nancy/Security/SecurityHooks.cs

或者具体的代码:

public static void RequiresAuthentication(this INancyModule module)
{
module.AddBeforeHookOrExecute(SecurityHooks.RequiresAuthentication(), "Requires Authentication");
}

安全 Hook :

public static Func<NancyContext, Response> RequiresAuthentication()
{
return UnauthorizedIfNot(ctx => ctx.CurrentUser.IsAuthenticated());
}

private static Func<NancyContext, Response> UnauthorizedIfNot(Func<NancyContext, bool> test)
{
return HttpStatusCodeIfNot(HttpStatusCode.Unauthorized, test);
}

private static Func<NancyContext, Response> HttpStatusCodeIfNot(HttpStatusCode statusCode, Func<NancyContext, bool> test)
{
return (ctx) =>
{
Response response = null;
if (!test(ctx))
{
response = new Response { StatusCode = statusCode };
}

return response;
};
}

如您所见,如果用户未通过身份验证,则返回 HttpStatusCode.Unauthorized 应该。似乎很容易。当我对如下路线进行 AJAX 调用时:

Post["/comment/flag/{Id}"] = s =>
{
this.RequiresAuthentication();
return new IdResponse { Id = commentRepo.FlagComment(Context.CurrentUser.UserName, s.Id) };
};

我返回一个 303,然后重定向到带有 200 的登录 URL。真讨厌。完全没有想到。

为了确保我没有完全疯了,我做了以下操作并且效果很好:

Post["/comment/{Id}"] = s =>
{
if ((Context.CurrentUser == null) ||
String.IsNullOrWhiteSpace(Context.CurrentUser.UserName))
{
return HttpStatusCode.Forbidden;
}

var req = this.Bind<CommentRequest>();
return commentRepo.AddComment(Context.CurrentUser.UserName, s.Id, req.Comment);
};

这将返回预期的 403。但是谁愿意将其粘贴到各处……不是我。我正在尝试弄清楚如何编写我自己的在路线运行之前执行的东西,但我是 Nancy 的新手。

奇怪的是,如果我改变:

return HttpStatusCode.Forbidden; 

变成一个

return new Response { StatusCode = HttpStatusCode.Forbidden };

然后我再次收到 303 和 200 响应。好像有什么东西坏了。谁能给我一些见解或我做错了什么的答案?南希对我来说似乎很伤心,特别是 Response 类......

最佳答案

我遇到了和你一样的问题 - 什么都没坏。

FormsAuthentication.Enable(pipelines, formsAuthConfiguration);

此代码将函数添加到流水线之前和之后。它需要每个 401 并将其更改为 303,因为您已经定义了如果用户未登录则应将其重定向。

为了防止这种情况发生,您可以将 DisableRedirect 属性设置为 true。实际上,您可以像这样对所有 Ajax 请求自动执行此操作:

new FormsAuthenticationConfiguration()
{
...,
DisableRedirect = context.Request.IsAjaxRequest()
};

此外,请确保您的请求将 X-Requested-With header 设置为 XMLHttpRequest,否则 nanacy 无法检测到它是一个 ajax 请求。为了将 DisableRedirect 设置为 true,您当然可以随意检测不同的正确请求(基于 url,...)。

关于NancyFx RequiresAuthentication 扩展返回 303 而不是 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com