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

E. *_*aep 5 authentication asp.net-mvc middleware owin

我目前正在组建一个自定义OWIN身份验证中间件,以便重用我们的中央身份验证机制.

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

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

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

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

小智 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);
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我们检查 oauth 服务中的访问令牌是否存在,如果存在,则在请求上设置 ClaimsPrincipal (这将使其绕过该[Authorized]属性)。然后,在处理请求后,await next()我们可以检查响应状态并设置所需的重定向。

显然,这是一个非常简单的案例,没有考虑角色或声明等因素,但它应该可以帮助您走上正轨。