我需要始终始终获得登录用户。

调用过程将通过的对象是spweb。

因为这是遗留代码,我无法更改调用进程发送的内容,这是以下问题: 其中一些人在SPWeb上传递,因为它的SPWeb中有一些发送在升高的私权。对于升高的PREFELEGES,登录用户返回为系统。

在这两种情况下,我想要获取登录用户的当前。

是这样做的吗?

有帮助吗?

解决方案

在这里有两个可能的情况。

案例a:您超出了runWithelevatePrivileges范围 您可能会获得一个高架的SPWeb实例,它已保存在RunWithElevatePrivileges委托的范围之外。这是大多数情况下的代码恐怖,但仍然可以。 在这种情况下,基于升高的URL重新创建一个新实例就足够了:新实例不会提升,因此您可以从那里获取您的用户。

case b:您的方法在runWithElevatePrivileges中调用委托 在这种情况下,重新创建SPWeb实例不会有任何好处。任何新实例仍将升高,所以这是一个禁忌。 要逃避这种情况,您需要找到一个在高度范围之外创建的实例。如何?通过利用执行上下文:例如,在一个特征事件接收器中,您可以在事件属性等中访问Web实例。由于您处于自定义方法并且无法更改接收的参数,因此您需要访问某种上下文。你能坐落在spcontext.current.web吗?该实例未提升,因此用户应该是当前浏览该站点的。也就是说,您可能处于上下文无效/ null的情况下,在这种情况下,在哪个情况下,无法从高架实例中获取原始用户:您需要将其存储在某处(提示:静态单例?)在进入高程上下文之前。


编辑

如果您的方法在runWithElevatePrivileges委托内调用,则该怎么办,但您不确定拥有有效的SpContext?这只是一个非常狂野的猜测,但让我们想一想。 RunWithElevatePrivileges将恢复为应用程序池标识,对右图呤吗?如果没有应用程序池,那将意味着没有应用程序池标识,因此委托外部和中外的当前用户应该是相同的。如果有一个应用程序池,大多数时间将有一个spcontex,它是根据定义取消调的。还有一些特定的情况,您在计时器作业中运行,此类上下文是null:在这种情况下,我相信您正在使用App Pool Inderity,因此,再次运行升高应具有没有效果。

基于此,您的最佳选择是尽可能将用户从SpContex使用,并且当上下文为空时,升高和未被限制的用户是相同的。 用一粒盐,虽然...

其他提示

作为fazio表示,使宽容代码的起始开发人员应该使用冒险的冒险来传递spweb对象,但在你的情况下你不能!

升降意味着您的SPWeb对象升高到系统用户,并将返回该用户,无论如何都会突出SPWeb对象!

SPUser loggedinUser = SPContext.Current.Web.CurrentUser;
.

如果它从高架的SPWeb对象中出现上面的代码,则可以起作用,但如果它在升高的块内,它将返回系统账户不幸!

你能发布一些代码吗?或者给我们一些信息进入您将使用的spweb对象传递给我们?也许您可以使用上面的代码在当前打开的spweb对象中,然后将spweb对象设置为升高的对象?

但是短答案是否,您无法从高架用户获取实际登录用户!

许可以下: CC-BY-SA归因
scroll top