如何将我的请求中的安全主体传递到 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 中的线程中的主要内容,如果未能解决你的问题,请参考以下文章