【发布时间】:2017-08-06 21:14:12
【问题描述】:
我在 asp 中创建了我的自定义身份验证中间件。 net core 项目,并注册如下:
public class MyAuthenticationMidleware
{
private readonly RequestDelegate _next;
public ConnectAuthenticationMidleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (!UserIsAuthenticated())
{
context.Response.StatusCode = 401;
return;
}
...
await _next.Invoke(context);
}
}
public static class MyAuthenticationMidlewareExtensions
{
public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyAuthenticationMidleware>();
}
}
在启动中:
public void Configure(...)
{
app.UseStaticFiles();
app.UseMyAuthentication();
app.UseMvc();
}
这可以正常工作 - 为每个请求运行身份验证中间件。如果用户未通过身份验证,则返回 401。否则会调用特定的 mvc 操作。
我试图做的是阻止身份验证中间件运行某些特定操作。我使用MapWhen方法创建了另一个扩展方法,使用如下:
public static class MyAuthenticationMidlewareExtensions
{
public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyAuthenticationMidleware>();
}
public static IApplicationBuilder UseMyAuthenticationWhen(this IApplicationBuilder builder, Func<HttpContext, bool> predicate)
{
return builder.MapWhen(predicate, applicationBuilder => applicationBuilder.UseMyAuthentication());
}
}
public void Configure(...)
{
app.UseStaticFiles();
app.UseMyAuthenticationWhen(context => context.Request.Path != "xyz");
app.UseMvc();
}
很遗憾,这并没有按预期工作。仅当路径与“xyz”不同时才调用中间件,但它似乎使整个链短路——没有调用特定于 mvc 的操作或过滤器。
可能我对MapWhen 的理解是不正确的。有什么办法可以得到我想要的结果吗?
【问题讨论】:
标签: asp.net-core asp.net-core-mvc