- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个作为 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/
我正在创建一个简单的项目来测试 Entity Framework 中的功能。在前端,我想要一个 SPA 应用程序,它使用 OData API 与服务器交互。我如下设置我的第一个 ODataContro
在 OData v4 Controller 中,是否可以为 Get() 和 Get([FromIDataUri] key) 返回不同的模型? 我喜欢使用 ViewModel,当使用 Get() 方法时
我正在开发一个通过 OData 提供数据的应用程序。我正在使用 ASP.Net 和 ODataControllers 通过 EF 查询——数据由 SQLServer 数据库支持。 在可视化这些数据的前
我有一个作为 MEF 插件实现的 ODataController。该 Controller 在启动时从服务器应用程序加载。我在服务器应用程序中创建了另外 3 个 ODataController,它允许
更新 投票here on User Voice解决歧义。 我编写了一个继承于 ODataController 的 OData WebAPI Controller 。 . public class Ma
我有课,MyClassController继承自 ODataController .我已经能够使用“自动”路由来访问缩放器集合类型的属性,例如 /path/to/MyClass(100)/SomePr
我正在 Web API 2.2 上构建 OData 3 服务。 该服务正确返回我的实体的元数据,但当我查询其中一个实际实体时返回 406 Not Available。我已经做了相当多的研究(我目前正在
谁能解释我什么时候应该继承我的 Controller 表单ODataController对比 ApiController ? 问题是由 ApiController 返回的结果引起的。可以使用 ODat
在将 OData 添加到我的项目之前,我的路线设置如下: config.Routes.MapHttpRoute( name: "ApiById",
我有一个带有 Int64 列的数据对象: [TableAttribute(Name="dbo.vw_RelationLineOfBusiness")] [DataServiceKey("Provide
我编写了一个继承自 ODataController 的 OData WebAPI Controller . public class ManyColumnsController : ODataCont
我正在为我的应用程序 OData Controller 实现一个通用基础 Controller 。这个 Controller 有一个像这样的方法: [EnableQuery(AllowedQueryO
我正在尝试抽象 VS 2013 中自动生成的 ODataController 类,因为除了 POCO 的名称之外,不同 Controller 的代码看起来相同,因此,我做了以下操作: public
如何在 odatacontroller 中删除 asp.net odata.metadata 属性。 我有以下代码: public IHttpActionResult GetCompanyViewM
我正在尝试从我们当前的 ApiController 实现转移到 ODataController,因为这是我发现可以启用返回 OData Json 格式数据的唯一方法。 (与问题 here 相同,但解决
谁能列出 WebAPI 和 OData Controller 之间的区别? 最佳答案 WebApi 是一种应用程序类型(可能是一个框架),用于促进不同平台(web、mobile、windows)之间的
我是一名优秀的程序员,十分优秀!