我目前正在整理自定义OWIN身份验证中间件,以便重用我们的中央身份验证机制。
为了控制对页面的访问,我在控制器上使用[Authorize]
和[AllowAnonymous]
属性。
即使我理解OWIN中间件和属性处于页面生命周期的不同阶段,我想知道是否有办法通知中间件AllowAnonymous
属性存在且存在无需进一步处理请求。
通常,让中间件触发身份验证过程(在我的情况下,暗示转到远程页面 - OAuth2类型的身份验证)在访问应该匿名访问的站点的入口页面时会出现问题。
有人知道如何实现这一目标吗?
答案 0 :(得分:3)
我知道这真的很老了,但我遇到了同样的问题。如果你还没有找到答案,也可以帮助其他人来看看:
关于中间件的要记住的事情是,你可以在控制器获取请求之前处理请求,之后是响应。因此,您不需要直接访问属性,只需查看其结果即可。
请考虑以下事项:
namespace CustomAuthApp.MVC
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.Use(async (ctx, next) =>
{
if (ctx.ExtensionMethodToCheckIfAccessTokenExistsInRequestMaybeAsACookie())
{
var ident = new ClaimsIdentity("External");
ctx.Request.User = new ClaimsPrincipal(ident);
}
await next();
if (ctx.Response.StatusCode == 401)
{
var loginUri = String.Format("{0}?ReturnUrl={1}", "/Account/Login", ctx.Request.Path);
ctx.Response.Redirect(loginUri);
}
}
});
}
}
我们检查是否存在来自oauth服务的访问令牌,如果存在,请在请求上设置ClaimsPrincipal(这将使其绕过[Authorized]
属性)。然后,在await next()
处理请求之后,我们可以检查响应状态并设置所需的重定向。
显然,这是一个非常简单的案例,并没有考虑角色或索赔等问题,但它应该让你顺利进行。