【问题标题】:How to call web API under specific user permission?如何在特定用户权限下调用 Web API?
【发布时间】:2017-10-31 08:40:50
【问题描述】:

我有一个函数允许最终用户执行Workflow(包含许多 API)或安排它作为后台作业运行。

示例:User1 创建 Workflow1,其中包含 3 个 API(Api1Api2Api3),并将其配置为每天早上 9 点运行。

我使用HttpClient 像这样调用每个 API:

var client = new HttpClient { BaseAddress = new Uri("http://localhost/") };
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.PostAsJsonAsync("/api/services/myApp/workflow/Api1?input=something", "").Result;

如何在用户未登录应用程序时将User1 的凭据添加到请求中(因为它将作为计划作业自动运行)?

更新 1

我决定use reflection to call an API by string name

在直接执行API的情况下,如何在特定权限下运行?

更新 2

我已将代码放入 using 块中,但所有 API 均已成功触发:

using (_session.Use(1, 3)) // 3 is the Id of User1, who has no permissions
{
    // Execute operator
    switch (input.Operator.Type)
    {
        case "api":
            executeApiResult = await ExecuteApi(input);
            break;
        case "procedure":
            executeApiResult = await ExecuteProcedure(input);
            break;
        default:
            return new ExecuteOperatorOutput
            {
                Result = new ExecuteOperatorResult { Status = false, Message = $"Wrong operator type: {input.Operator.Type}" },
                WorkflowStatus = false
            };
    }
}

【问题讨论】:

    标签: asp.net-web-api dotnet-httpclient aspnetboilerplate


    【解决方案1】:

    在直接执行API的情况下,如何在特定权限下运行?

    您可以override current session values 并在using 块内调用您的方法。

    我已将代码放入 using 块中,但所有 API 均已成功触发

    将您的 API 方法声明为 public virtual,因为 AbpAuthorize 有一些限制。

    【讨论】:

      【解决方案2】:

      你有两个选择。

      1- 您可以匿名访问这些应用程序服务。如果您希望它是安全的,请发送加密的安全令牌。

      2- 你没有提到你的项目是 MVC 还是 Angular。我假设你有 Angular 版本。您需要一个不记名令牌来发出经过身份验证的请求。首先,您必须对用户进行身份验证并获取令牌。然后将此不记名令牌添加到每个请求中。

      您必须研究在 asp.net 核心中使用不记名令牌...

      【讨论】:

      • 我的项目是asp.net 4.6.1中的MVC。我可以使用不记名令牌吗?
      • 对于 MVC,您不能使用不记名令牌。您需要进行 cookie 身份验证。在您提出登录请求后。您将获得响应 cookie。你要做的是;将这些 cookie 添加到您的请求中。如果我没记错的话 cookie 必须是 ASP.NET_SessionId .AspNet.ApplicationCookie
      • 解决方案不是几行代码。所以我无法为你提供完整的代码解决方案。
      • 谢谢,但是如何在没有用户登录的情况下获取cookie?我需要将工作流作为计划作业运行。
      • 我认为你走错路了。您无法验证没有凭据的用户。你为什么不忽略身份验证!简单的解决方案;做匿名认证服务。添加一个安全令牌,您可以解密并检查以继续。不要进行身份验证,只需将令牌、用户 ID 和其他参数发送到应用服务方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多