gpt4 book ai didi

c# - 在 ODataController 中使用服务引用不适用于 IIS

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:19 25 4
gpt4 key购买 nike

我有一个作为 MEF 插件实现的 ODataController。该 Controller 在启动时从服务器应用程序加载。我在服务器应用程序中创建了另外 3 个 ODataController,它允许获取当前用户的 ID、权限和角色(从 ServerApplicationContext 获取的信息)。在这些 Controller 中创建了一个服务引用,它允许将插件与服务器应用程序分离,这样我就不需要在插件中引用 ServerApplicationContext。在插件/扩展中,服务引用将按如下方式使用(实际上封装在静态类的方法中 -> 服务将在其工作时立即注入(inject)):

Contracts.CurrentUserData.Administration _administrationService = new Contracts.CurrentUserData.Administration(new Uri(ConfigurationManager.AppSettings["A.Key"]));
_administrationService.Credentials = CredentialCache.DefaultCredentials;
_administrationService.CurrentUsers.ToList().First().Identity

只要应用程序不直接从 VS2013 运行 IIS express,它就可以正常工作。一旦将应用程序部署到独立的 IIS,从插入的 Controller 调用服务引用就会抛出异常:

Microsoft.LightSwitch.Server: Unable to authenticate.  Access is denied.
at Microsoft.LightSwitch.Utilities.ServerGenerated.Internal.ServerApplicationContextFactoryCore.AuthenticateUser()
at Microsoft.LightSwitch.Server.ServerApplicationContextFactory.CreateContext(ServerApplicationContextCreationOptions options)
at Microsoft.LightSwitch.Framework.Server.ServerApplicationContext`3.CreateContext()
at LightSwitchApplication.Controllers.CurrentUserPermissionsController.GetCurrentUserPermissions(ODataQueryOptions`1 queryOptions)
Microsoft.Data.Services.Client: An error occurred while processing this request.
at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)
at System.Data.Services.Client.DataServiceQuery`1.Execute()
at System.Data.Services.Client.DataServiceQuery`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at ODataExtensions.CurrentUserDataHelper.GetPermissionsOfCurrentUser()
at ODataExtensions.CurrentUserDataHelper.HasCurrentUserPermission(String permissionId)
at ODataExtensions.Controllers.HealthChecksController.<GetHealthChecks>d__2.MoveNext()

重要:服务引用的 URL 已正确配置。用于获取有关当前用户的信息的 ODataControllers 是可访问的,如果直接访问它们,它们会返回正确的数据。一旦通过服务引用调用它们,就会发生上述错误。

最佳答案

以下代码的问题在于,DefaultCredentials 表示应用程序正在运行的当前安全上下文的系统凭据。

Contracts.CurrentUserData.Administration _administrationService = new Contracts.CurrentUserData.Administration(new Uri(ConfigurationManager.AppSettings["A.Key"]));
_administrationService.Credentials = CredentialCache.DefaultCredentials;
_administrationService.CurrentUsers.ToList().First().Identity

在 IIS Express 上,应用程序在管理员的安全上下文中运行 - 与我用于本地测试的用户相同。在独立 IIS 实例上,应用程序在用户 IIS APPPOOL\DefaultAppPool 的安全上下文中运行。

解决方案

为了解决这个问题,我不得不模拟服务引用调用。以下代码是从 ODataController 调用的,因此可以从 HttpContext 获取用于模拟的用户身份。

    public static String GetCurrentUserId()
{
var administrationService = GetServiceReferenceInstance();
var identity = (WindowsIdentity)HttpContext.Current.User.Identity;
administrationService.Credentials = CredentialCache.DefaultCredentials;
using (var impersonationContext = identity.Impersonate())
{
return administrationService.CurrentUsers.ToList().First().Identity;
}
}

private static Contracts.CurrentUserData.Administration GetServiceReferenceInstance()
{
return new Contracts.CurrentUserData.Administration(new Uri(ConfigurationManager.AppSettings["AKey"]));
}

关于c# - 在 ODataController 中使用服务引用不适用于 IIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com