如果 RequiresAuthentication 中缺少声明,则重定向
Redirect if claim is missing in RequiresAuthentication
我正在努力在我的应用程序中设置双因素,如果用户已登录但未经过验证,我会尝试使其重定向回验证页面(我正在跟踪是否用户在添加到 ClaimsPrincipal 'IsVerified') 的会话 table 中得到验证。
我遇到的问题是我在文档中使用的示例似乎无法正常工作:
public static class ModuleSecurity
{
public static string[] ExcludedPaths = { "/", "/login", "/login/verify", "/admin/settings", "/login/tf/setup" };
public static void RequiresAuthentication(this NancyModule module)
{
module.Before.AddItemToEndOfPipeline(RequiresAuthentication);
}
private static Response RequiresAuthentication(NancyContext context)
{
// Check if user is authenticated
if (context.CurrentUser == null)
return new Response() { StatusCode = HttpStatusCode.Unauthorized };
if (context.CurrentUser.FindFirst("RequireVerification")?.Value == "True" && context.CurrentUser.FindFirst("IsVerified")?.Value != "True" && !ExcludedPaths.Any(x => x.ToLower() == context.Request.Path.ToLower()))
return new Response().WithHeader("Location", "/login/verify").WithContentType("text/html").WithStatusCode(HttpStatusCode.SeeOther);
return null;
}
}
设置断点 我看到 "module.Before.AddItemToEndOfPipeline" 已执行,但它没有执行我的其他方法。
然后问题是我将其添加到 BEFORE 管道,但我在路由被触发后调用 this.RequiresClaims(所以我需要 AFTER 管道)。我能够通过添加扩展并使用 module.AddBeforeOrExecute 选项来做到这一点。
我正在努力在我的应用程序中设置双因素,如果用户已登录但未经过验证,我会尝试使其重定向回验证页面(我正在跟踪是否用户在添加到 ClaimsPrincipal 'IsVerified') 的会话 table 中得到验证。
我遇到的问题是我在文档中使用的示例似乎无法正常工作:
public static class ModuleSecurity
{
public static string[] ExcludedPaths = { "/", "/login", "/login/verify", "/admin/settings", "/login/tf/setup" };
public static void RequiresAuthentication(this NancyModule module)
{
module.Before.AddItemToEndOfPipeline(RequiresAuthentication);
}
private static Response RequiresAuthentication(NancyContext context)
{
// Check if user is authenticated
if (context.CurrentUser == null)
return new Response() { StatusCode = HttpStatusCode.Unauthorized };
if (context.CurrentUser.FindFirst("RequireVerification")?.Value == "True" && context.CurrentUser.FindFirst("IsVerified")?.Value != "True" && !ExcludedPaths.Any(x => x.ToLower() == context.Request.Path.ToLower()))
return new Response().WithHeader("Location", "/login/verify").WithContentType("text/html").WithStatusCode(HttpStatusCode.SeeOther);
return null;
}
}
设置断点 我看到 "module.Before.AddItemToEndOfPipeline" 已执行,但它没有执行我的其他方法。
然后问题是我将其添加到 BEFORE 管道,但我在路由被触发后调用 this.RequiresClaims(所以我需要 AFTER 管道)。我能够通过添加扩展并使用 module.AddBeforeOrExecute 选项来做到这一点。