从OWIN身份验证中间件中考虑控制器属性

时间:2014-04-09 16:48:22

标签: asp.net-mvc authentication middleware owin

我目前正在整理自定义OWIN身份验证中间件,以便重用我们的中央身份验证机制。

为了控制对页面的访问,我在控制器上使用[Authorize][AllowAnonymous]属性。

即使我理解OWIN中间件和属性处于页面生命周期的不同阶段,我想知道是否有办法通知中间件AllowAnonymous属性存在且存在无需进一步处理请求。

通常,让中间件触发身份验证过程(在我的情况下,暗示转到远程页面 - OAuth2类型的身份验证)在访问应该匿名访问的站点的入口页面时会出现问题。

有人知道如何实现这一目标吗?

1 个答案:

答案 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()处理请求之后,我们可以检查响应状态并设置所需的重定向。

显然,这是一个非常简单的案例,并没有考虑角色或索赔等问题,但它应该让你顺利进行。