使用 ADFS 声明使用 .Net MVC 授权属性重定向循环

2023-11-25

我在使用 .Net MVC 5 应用程序配置 ADFS 时遇到问题。

我已经在 VS 2015 中将我的项目配置为使用声明,它工作正常,但我有一个问题。

我可以使用 ADFS 登录,我可以检查用户角色等。当我尝试使用时出现问题

[Authorize(Roles="somenonExistingRole")]

尽管我已经通过了身份验证,但当再次进行身份验证时,我会被重定向到 ADFS 页面,并且我会被重定向到发生循环的页面。页面将我发送到 ADFS 门户,ADFS 将我重定向到门户,经过几次尝试后,我从 ADFS 收到错误(对于许多请求)

我必须自己实现类似角色提供程序的东西吗?或者我需要配置一些额外的东西。也许我可以限制尝试次数?当我的角色已准备就绪时,为什么我会被重定向到 ADFS?

代码中实际上没有太多可显示的内容,按照要求: 我正在测试的控制器:

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        [Authorize]
        public ActionResult About()
        {
            var u = HttpContext.User;


            if (u.IsInRole("/"))
            {
                ViewBag.Message = "User is in role.";
            }
            else
            {
                ViewBag.Message = "User is NOT in role.";
            }

            return View();
        }
        [Authorize(Roles = "/nonexistingRole")]
        public ActionResult Contact()
        {

            ViewBag.Message = "Your contact page.";

            return View();
        }
    }

和配置身份验证部分

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseWsFederationAuthentication(
        new WsFederationAuthenticationOptions
        {
            Wtrealm = realm,
            MetadataAddress = adfsMetadata, 

        });
}

要解决循环问题,您应该覆盖AuthorizeAttribute.

默认情况下,当用户的角色不满足要求时,MVC 将返回 401 UnauthorizedAuthorizeAttribute要求。这将初始化对身份提供者的重新身份验证请求。由于用户已经登录,AAD 返回同一页面,然后发出另一个 401,创建重定向循环。在这里,我们重写 AuthorizeAttribute 的 HandleUnauthorizedRequest 方法以显示在我们的应用程序上下文中有意义的内容。

该类是在使用 VS 2015 创建新的 MVC 项目时生成的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{        
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            //One Strategy:
            //filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);

            //Another Strategy:
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new
                    {
                        controller = "Error",
                        action = "ShowError",
                        errorMessage = "You do not have sufficient priviliges to view this page."
                    })
                );
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ADFS 声明使用 .Net MVC 授权属性重定向循环 的相关文章

  • 通过向导方法使用内置 ASP.NET MVC 验证

    我正在使用JQuery Steps 插件基本表单示例 http www jquery steps com Examples basic form为了我的巫师 在此示例中 您会注意到他们使用的是 JQuery Validate 插件 该插件与
  • JSON.NET 不区分大小写的反序列化不起作用

    我需要将一些 JSON 反序列化到我的对象中 其中 JSON 的大小写未知 不一致 JSON NET 应该不区分大小写 但它对我不起作用 我的班级定义 public class MyRootNode public string Action
  • 如何将当前用户信息传递到 DDD 中的所有层

    类似的问题以前曾被问过 但不完全相同 除非我错过了 我想通过我的服务 域 域事件 域事件处理程序传递 IUserInfo 类实例 什么是最好的方法 我是不是该 通过注册使用 IoC 注入它 针对 Httpcontext Current se
  • 如何使 sgen.exe 保留程序集的版本?

    我想为我的程序集创建一个序列化程序集 sgen做得很好 但我不知道如何让它为序列化程序集分配与源程序集相同的版本 有任何想法吗 sgen似乎默认采用源程序集版本 这是相当合理的 这是我的运行方式 没有什么特别的 PathToSDK Micr
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • ASP.NET MVC 中的访问控制取决于输入参数/服务层?

    序言 这是一个有点哲学问题 我更多地寻找 正确 的方法来做到这一点 而不是 一种 的方法来做到这一点 假设我有一些产品 以及一个在这些产品上执行 CRUD 的 ASP NET MVC 应用程序 mysite example products
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 带 ref 参数的委托

    有没有办法在下面的代码中维护相同的功能 但不必创建委托 我正在与第 3 方 API 进行交互 其中包含许多不同的 DeleteSomethingX ref IntPtr ptr 方法 并且我正在尝试集中 IntPtr Zero 检查的代码
  • SagePay 直接集成套件 v4.00 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 4 00 版本的 Dot Net SagePay 直接集成套件 我试图在 SagePay
  • 如何使用线程使 Windows 服务长期运行

    我有一个 win 服务托管一些我需要保持长时间运行的工作流程 一个 WorkflowApplication 和一个 WorkflowServiceHost 因为 OnStart 要求它完成并返回操作系统 所以我有一个在线程池中的另一个线程上
  • 机器的最大 TCP 连接数

    我正在 NET 中创建一个 Windows 服务 N 个客户端可以连接到该服务 该服务启动 TCP 侦听器并接受客户端连接 我面临的问题是我只能打开 10 个到该服务的连接 Listener AcceptTcpClient 方法仅接受 10
  • 使用 SSH.NET SftpClient 设置扩展文件属性

    在使用 Renci SSH NET SFTP 库将文件从 Windows 上传到远程计算机 Ubuntu 16 04 LTS 后 我尝试使用扩展文件属性来存储一些信息 但属性没有得到保留 这就是我尝试设置扩展属性的方式 SftpFileAt
  • 仅当单击复选框时才更改 ListViewItem 的选中状态

    默认情况下 双击 ListViewItem 会切换其选中状态 我只想通过单击项目的复选框或在突出显示项目时按空格键来更改选中状态 这容易做到吗 该解决方案涉及 3 个事件和 1 个 bool 类型的状态变量 private bool inh
  • 如何延迟关闭并在窗口服务中运行进程

    我必须在 Windows 关闭时运行一个进程 即应用程序 有什么方法可以延迟 Windows 关闭并在 Windows 服务中运行该应用程序 protected override void OnShutdown Add your save
  • 连接池

    我有以下代码 如果我在最后使用 conn null 我仍然使用连接池吗 我知道关闭连接是一个很好的做法 但是如何处理整个连接对象呢 public void ExecuteNonQuery SqlCommand Cmd Connection
  • 使用 C# .NET 从操纵杆获取输入

    我在谷歌上搜索了这个 但我想到的唯一的东西已经过时并且不起作用 有人知道如何使用 C NET 获取操纵杆数据吗 由于这是我在研究 C 中的操纵杆 游戏手柄输入时在 google 上获得的最高点击次数 因此我认为我应该发布一个回复供其他人查看
  • 部分 ASP.NET MVC 视图提交

    我是 ASP NET MVC 的新手 所以这个问题可能显得 愚蠢 抱歉 我的主视图中有一个部分视图 部分视图提交一个表单 调用 HomeController 内的操作方法 它与服务器验证配合得很好 问题是在发布后仅呈现部分视图 发布后如何呈
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 从 DataGridColumn 中绑定到 DataContext 属性

    财产Foo在我的DataContext ViewModel Visibility Foo 但我不知道如何访问Foo里面一个Column 在这种情况下 我认为它可能正在寻找Foo在任何绑定到的对象中DataGrid ItemsSource
  • 如何使用 IHttpActionResult 设置标头

    我想将令牌添加到 webapi 请求的标头中 我怎样才能做到这一点 这是我的示例代码 public IHttpActionResult Authenticate Login data var Token fdsf123546fskjhf g

随机推荐

  • 如何强制 ssh 从命令行接受新的主机指纹?

    我得到了标准 WARNING REMOTE HOST IDENTIFICATION HAS CHANGED IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY Someone could
  • 使下拉菜单可滚动

    我正在尝试使用 CSS 和 jquery 在 HTML 页面中实现下拉菜单 以下是 HTML 和 JavaScript 代码的示例
  • Chrome tabs.onActivated.addListener 抛出“未定义”TypeError

    我正在做一个 chrome 扩展 文档中有这个说法 about chrome tabs onActivated 每当我尝试放置chrome tabs onActivated addListener 它说Uncaught TypeError
  • 使用 HTMLAgilityPack 仅提取页面文本

    好的 我对 HTMLAgilityPack 中使用的 XPath 查询非常陌生 所以让我们考虑这个页面http health yahoo net articles healthcare what your favorite flavor s
  • Qt - 没有这样的信号错误

    我试图在双击可拖动小部件之一时触发信号冰箱贴示例 以下是我对示例源代码所做的更改 拖动标签 class DragLabel public QLabel public DragLabel const QString text QWidget
  • 如何在Python中使用BeautifulSoup解析google搜索结果

    我正在尝试解析谷歌搜索结果的第一页 具体来说 是提供的标题和小摘要 这是我到目前为止所拥有的 from urllib request import urlretrieve import urllib parse from urllib pa
  • 获取特定用户的last_login时间? (姜戈)

    我有代码User objects values list last login flat True 这为我提供了所有用户最后一次登录的列表 但我不确定您如何精简对特定用户所做的操作 我尝试了以下代码User objects get user
  • 将浮点数序列化为 32 位整数的可移植方法

    我一直在努力寻找一种可移植的方法来序列化 C 和 C 中的 32 位浮点变量 以便将其发送到微控制器或从微控制器发送 我希望格式定义得足够好 以便序列化 反序列化也可以从其他语言完成 而不需要太多的努力 相关问题有 C 中 double f
  • PDO 多重查询

    从 PHP 版本 5 3 开始PDO MYSQL驱动程序已被替换为有利于PDO MYSQLND 它引入了对多个查询的支持 不过 如果有多个结果集 我不知道如何获得两个结果集SELECT查询已通过 两个查询都已执行 不可能是第二个查询刚刚被转
  • 删除 UICollectionView 边缘的单元格 - 滚动后单元格不会立即出现

    考虑一个标准的垂直滚动流布局 其中填充了足够的单元格以引起滚动 当滚动到底部时 如果删除一个项目 使得集合视图的内容大小必须缩小以容纳新的项目数 即删除底行的最后一个项目 则从滚动到底部的单元格行顶部被隐藏 在删除动画结束时 顶行出现时没有
  • 如何在angularjs中将html数据导出为pdf

    这是我渲染所有内容的 html 代码json数据来自 js文件但得到 类型错误 无法将未定义或 null 转换为对象 在Function keys 处 在 DocMeasure measureNode pdfmake js 15647 在
  • matlab中的3D体素显示

    我有一个网格 它是 3D 的并且存储一个数字 这是我的网格的示例 如果它是 2 2 2 1 gt 0 0 0 0 2 gt 0 0 0 0 如果那里不存在体素 数字 0 通常是我想用颜色或 nan 表示的数字 我想做的是用 matlab 显
  • 是否可以使 display:table-cell 布局响应式?

    在我的代码中 有一个表 其中有一个分区 其中的表行由水平的复选框组成 这是我的示例代码 完整的代码在小提琴中Here HTML table cellpadding 0 border 0 width 100 cellspacing 0 tr
  • BouncyCastle 上的椭圆曲线与数字签名算法 (ECDSA) 实施

    我正在尝试实现 ECDSA 椭圆曲线数字签名算法 但我在 Java 中找不到任何使用 Bouncy Castle 的示例 我创建了密钥 但我真的不知道应该使用什么样的函数来创建签名并验证它 public static KeyPair Gen
  • numpy.rint 可以返回 Int32 吗?

    我正在做 ret np rint y 4 return ret 我希望它回来Int32 我尝试添加dtype Int32 但它错误地说 TypeError No loop matching the specified signature a
  • 如何使用 OpenCV 制作反向填充透明矩形?

    我想在这张图片中制作一个反向填充的矩形 我的代码 import cv2 lena cv2 imread lena png output lena copy cv2 rectangle lena 100 100 200 200 0 0 255
  • ReportLab 图片链接

    有没有办法在 ReportLab 中向 Platypus 图像对象添加 href 链接 我知道如何在段落中的文本上添加链接 但我似乎找不到有关添加图像链接的任何信息 这可以通过以下方式轻松实现超链接图像类米斯梅利提出 from report
  • C 中允许的静态数组的最大大小是多少?

    在我的算法中 我知道使用静态数组 而不是动态数组 但我有时 达到堆栈的极限 我对吗 静态数组存储在堆栈中 哪些参数会影响一个 C 程序的最大堆栈大小 是否有许多系统参数影响最大数组大小 最大没有 元素的数量取决于数组类型 它取决于系统 RA
  • Windows XP 与 Vista/7 上的 MS Crypto API 行为

    我试图了解如何在 XP Vista 和 Windows 7 上从 PEM 格式 示例包含在下面的代码中 导入公钥 示例代码将在 XP 和 Windows Vista 7 上导入密钥 但不会一样的方法 在 Windows XP 上 字符串 原
  • 使用 ADFS 声明使用 .Net MVC 授权属性重定向循环

    我在使用 Net MVC 5 应用程序配置 ADFS 时遇到问题 我已经在 VS 2015 中将我的项目配置为使用声明 它工作正常 但我有一个问题 我可以使用 ADFS 登录 我可以检查用户角色等 当我尝试使用时出现问题 Authorize