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

Posted

技术标签:

【中文标题】如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中【英文标题】:How do I pass security principal from my request into a thread in asp.net MVC 【发布时间】:2016-06-18 07:39:30 【问题描述】:

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

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

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

这是我正在做的一些 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 中展示的安全检查在我使用的一些库中实际上是错误的,所以如果我能提供帮助,我真的不想改变它。我只是想从我的请求中获取委托人到我的线程中。

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

【问题讨论】:

【参考方案1】:

您为什么要检查每个线程中的安全主体。您只需要在运行 SlowCalculation 方法之前检查安全主体。

或者如果你真的想要

public static void SlowCalculation(params, System.Security.Principal.GenericPrincipal principal)

    _calculationIsRunning = true;
    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
        var principal = System.Security.Principal.GenericPrincipal.Current;
        System.Threading.Tasks.Task.Run(() => SlowCalculation(params, principal));
    
 

【讨论】:

我需要在 SlowCalculation 中进行检查,因为我正在使用现有的业务对象来进行自己的安全检查。我尝试只传递委托人,但一旦请求退出它就会被处理,所以在我的线程中没有用。【参考方案2】:

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

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

【讨论】:

以上是关于如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net 核心中从返回零计数的主体正确映射数组

将对象从dll文件传递到文件asp.net c#后面的代码

如何保护 ASP.NET 中的 AJAX 请求?

如何将我的 asp.net 项目发布到我的本地 iis?

如何使用 ASP.Net MVC 路由来路由图像?

详细介绍ASP.NET页面间数据传递的使用方法