【发布时间】:2017-05-11 17:56:07
【问题描述】:
问题
所以我在 TFS 2017.1 上运行 1 个团队项目 - 通过 https://<hostname>:443/ 进行多个团队配置。
已经有一些团队拥有自己的 Tfs-Groups、权限、区域路径等。 每个团队的配置都是平等的:
- 团队成员(例如 NewTeam)
- 权限组(例如 Contributors_NewTeam)
- 团队的区域路径(例如 Development/NewTeam)
所有这些现有团队都是在 2017.1 之前创建的,并且按预期工作。
当我添加另一个团队并使用新用户测试访问权限时。 Tfs 未在该用户的 Web 访问中显示团队:
对于我自己的用户,我可以很好地查看和访问团队:
当用户被添加到任何其他现有团队时,他突然可以看到新创建的团队并访问它。
配置
“NewTeam”的配置如下:
创建团队并添加用户:
创建 Tfs-Group 并根据需要设置权限:
团队正在从 Tfs-Group 继承权限:
团队是 Tfs-Group 的成员:
Tfs-Group 是“项目有效用户”的成员:
将Tfs-Group添加到区域路径并根据需要设置权限:
目前的调查结果:
查看发送来获取组的 Web api 请求时,tfs 返回以下错误:
{
"$id":"1",
"InnerException":null,
"Message":"TF14045: The identity with TeamFoundationId <guid> could not be found.",
"TypeName":"Microsoft.VisualStudio.Services.Identity.IdentityNotFoundException, Microsoft.VisualStudio.Services.WebApi",
"TypeKey":"IdentityNotFoundException",
"ErrorCode":0,
"EventId":4207
}
经过一番谷歌搜索后应该读作:Not found or no sufficient permissions for team.
查看 tfs 服务器上的事件日志时,尝试通过 url 直接访问团队仪表板时出现以下错误:
Ausnahmemeldung: Object reference not set to an instance of an object. (Typ NullReferenceException)
Ausnahmestapelüberwachung: at Microsoft.TeamFoundation.Dashboards.DashboardSecurityNamespaceHelper.GetTeamMemberGroupPermissions(IVssRequestContext requestContext, Guid teamId)
at Microsoft.TeamFoundation.Dashboards.Services.DashboardService.GetDashboardGroup(IVssRequestContext requestContext, IDashboardConsumer dashboardConsumer)
at Microsoft.TeamFoundation.Server.WebAccess.Presentation.DashboardsViewHelper.GetViewModel(TfsWebContext tfsWebContext)
at Microsoft.TeamFoundation.Server.WebAccess.Presentation.DashboardsController.Index()
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
但我认为这只是 web api 调用没有返回团队信息的结果,随后的调用将 null 作为 id 传递。
我尝试了什么:
我多次比较...,“NewTeam”的所有权限都与现有的工作团队匹配。所以权限应该是正确的。
我尝试重启服务器
我尝试通过 quiesce / unquiesce 重启 tfs 服务
我尝试创建另一个团队,也多次尝试...,以防我错过了什么。
我查看了 tfs 项目集合数据库,发现
[tbl_Area]确实包含现有团队的路径,但不包含新创建团队的路径。但我没有找到原因。我尝试使用另一个测试用户,以防用户本身出现问题。
研究了 TFS 错误代码,但没有任何有用的东西,至少对我来说,出现了
在浪费了将近一整天的时间来研究并试图了解我错在哪里以及我误解了什么之后,我正在寻求您的帮助。
【问题讨论】:
-
创建另一个新团队,创建时,设置团队如the pictures所示。然后再次添加用户再次测试。告诉我结果。请使用IE浏览器测试。
-
尝试清理 TFS 服务器端的缓存(c:\TfsData\ApplicationTier_fileCache)和浏览器的缓存。
-
@Tingting0929-MSFT 缓存已清除,团队创建如您的图片,使用 IE 进行创建/访问测试 -> 与我的问题中描述的结果相同 :(
-
在其他团队项目中,是否也存在这个问题?
-
我尝试按照您在上面提供的步骤在我的 TFS 中重现您的问题,并且在我的环境中一切正常。你能想到什么特别的吗?
标签: tfs