加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 从OWIN身份验证中间件中考虑控制器属性

发布时间:2020-12-15 19:47:19 所属栏目:asp.Net 来源:网络整理
导读:我目前正在组建一个自定义OWIN身份验证中间件,以便重用我们的中央身份验证机制. 为了控制对页面的访问,我使用控制器上的[Authorize]和[AllowAnonymous]属性. 即使我理解OWIN中间件和属性处于页面生命周期的不同阶段,我想知道是否有办法通知中间件AllowAnonym
我目前正在组建一个自定义OWIN身份验证中间件,以便重用我们的中央身份验证机制.

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

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

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

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

解决方法

我知道这很老了,但我遇到了同样的问题.如果你还没有找到答案,还要帮助其他人来看:

关于中间件的要记住的是,你可以在控制器获取请求之前处理请求,然后再响应.因此,您无需直接访问属性,只需查看其结果即可.

考虑以下:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读