c# - 如何将安全主体从我的请求传递到 asp.net MVC 中的线程

标签 c# asp.net-mvc multithreading security

在我的 ASP.net MVC 应用程序中,我有一个请求执行大量计算以返回结果。这在我自己的服务器上运行良好,但当我转移到 Azure 时,连接/请求在 4 分钟后关闭,所以我永远得不到结果,我只是收到一个错误。

为了解决这个问题,我计划在一个线程中运行长时间的计算,并让客户端轮询以查看它何时完成。

我已经尝试了各种方法(线程、线程池、任务和 hangfire),但我无法将安全上下文/主体/身份从我的请求传递到我的新线程。

这是我正在做的一些 sudo 代码。 (我意识到多个请求应该有一些更好的同步,但这是 sudo 代码)

    public static void SlowCalculation(params)
    {
        _calculationIsRunning = true;
        var principal = System.Security.Principal.GenericPrincipal.Current;
        if (principal?.IsInRole("MySecurityGroup") ?? false)
        {
            // lots of long calculations
            _resutsAreReady = true;
            _calculationIsRunning = true;
        }
    }

    //
    // POST: /Get/
    public ActionResult GetResults(params)
    {
        if (_calculationIsRunning)
            return View("InProgress");
        else if (_resutsAreReady)
            return View("Results", results);
        else            
            // start the calcualtion on a new thread to avoiding having very long running connection that azure will close
            System.Threading.Tasks.Task.Run(() => SlowCalculation(params));
     }

我在 SlowCalculation 中显示的安全检查实际上在我使用的一些库中被限制了,所以如果我能帮助它,我真的不想改变它。我只想从我的请求中获取主体到我的线程中。

我曾尝试将标识传递给线程函数,但在请求完成时它会被处理掉。

最佳答案

在 ASP.NET 进程中拥有长时间运行的后台线程不是一个好主意。解决这个问题的正确方法是在 Azure 服务总线上发出计算请求,并通知一些工作进程并运行计算。

您可以在 Web 应用程序中进行授权检查,并让工作进程在不进行授权检查的情况下执行计算。如果计算取决于用户的身份,事情就会变得有点困难,因为您需要处理 session / token 过期的可能性。参见 my question here了解如何处理。

关于c# - 如何将安全主体从我的请求传递到 asp.net MVC 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35798267/

相关文章:

Asp.Net MVC 缺少样式并默认为登录页面

asp.net - 卫星程序集,ASP.NET 语言不变

c# - Thread.Sleep(0) 未按预期工作

c# - 在 c# 中从数据库检索数据到 dataGridView 时出现空行

c# - 网络适​​配器关闭时检测客户端断开连接

asp.net-mvc - IoC - 在需要时延迟 Controller 中的服务初始化

C线程打印数字序列: with even and odd number printing threads running parallely

c# - C#多线程聊天服务器,处理断开连接

c# - 从 App.xaml.cs 导航

c# - 如何在C#上查看存储过程更新结果