【问题标题】:How to use a custom built, authorized ASP.NET Core Web API in other Core web apps? [closed]如何在其他 Core Web 应用程序中使用自定义构建、授权的 ASP.NET Core Web API? [关闭]
【发布时间】:2016-08-16 05:39:01
【问题描述】:

所以我在 ASP.NET Core 中构建了一个由角色授权的自定义 Web API。在其他 Core Web 应用程序中使用此 API 的正确方法是什么?我应该如何授权应用程序使用 API?

编辑:关于我正在尝试做的更多细节:

假设我有一个授权策略。在我单独的 Web API 应用程序中,我在 Startup 中声明了该策略并授权了一些 API 方法。它可以工作,现在托管在“webapi.foo.com”,太棒了。现在假设我创建了一个新的、单独的 Web 应用程序,并且我想使用该 API 中的一些方法。所以我想我的问题有两个:如何在“webapi.foo.com”上调用这些方法?以及如何确保我的应用有权调用这些授权方法?

【问题讨论】:

  • “我应该如何授权应用程序使用 API?”是一个广泛的问题。可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案范围或隔离可以在几段中回答的问题。
  • 我用这个回复了别人。希望这可以缩小范围:所以让我们使用您的策略授权示例。在我单独的 Web API 应用程序中,我在 Startup 中声明了该策略并授权了一些 API 方法。它可以工作,现在托管在“webapi.foo.com”,太棒了。现在假设我创建了一个新的、单独的 Web 应用程序,并且我想使用该 API 中的一些方法。所以我想我的问题有两个:如何在“webapi.foo.com”上调用这些方法?以及如何确保我的应用有权调用这些授权方法?
  • 如果您预见到需要在授权框架中相互通信的许多 Web 应用程序的开发,您将受益于开发一个仅对您的其他 Web 应用程序进行授权管理的 Web 应用程序,或者换句话说,身份提供者。您可以实现授权令牌或 HMAC 或任何其他可以为您提供相同功能的机制。
  • 这个问题还是太笼统了。任何人都能提供的只是一般指导。你试过什么?

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-core


【解决方案1】:

授权 我通过让前端系统 (webapp.foo.com) 调用后端 API (api.foo.com) 上的登录方法来使用 Json Web 令牌 (JWT) 和承载身份验证来完成此操作。 api.foo.com 上的登录方法对用户进行身份验证并在其响应中发出 JWT。 webapp.foo.com 然后使用这个 JWT 来验证它的控制器中的操作(通过定义一个使用令牌声明的授权策略),并且每当它在那里进行调用时,还将令牌传递给 foo.api.com。 webapp.foo.com 和 api.foo.com 都只需要根据 JWT 的声明集构建他们的授权策略,然后他们就可以共享令牌的使用。

调用 api.foo.com

            string jwt = xxx.yyy.zzz; //use the actual JWT returned from your login call
        var client = new HttpClient("http://api.foo.com");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwt); //add the JWT to the authorization header
        var requestStr = JsonConvert.SerializeObject(new { myParam = viewModel.myParam }); //serialize the object you are passing as a parameter to api.foo.com as Json
        HttpContent requestBody = new StringContent(requestStr, Encoding.UTF8, "application/json");
        var response = await client.PostAsync("myController\\myAction", requestBody);  //POST to api.foo.com (or whatever action you want to take)
        response.EnsureSuccessStatusCode();

        var resultstr = response.Content.ReadAsStringAsync().Result; //read the result as a string
        dynamic resultObj = JsonConvert.DeserializeObject<dynamic>(resultstr); //if desired, deserialize it to an object (I just used dynamic as an example)

【讨论】:

  • 谢谢!!正是我想要的。
【解决方案2】:

不能 100% 确定我是否正确理解了您的问题。

如果您使用使用命名策略的 AuthorizeAttribute 装饰控制器/操作,则使用您的控制器库的 Web 应用程序可以在启动时定义命名策略并配置允许访问的角色或声明或其他要求。

[Authorize(Policy = "SystemLogPolicy")]

启动示例:

services.AddAuthorization(options =>
{
    options.AddPolicy(
        "SystemLogPolicy",
        authBuilder =>
        {
            authBuilder.RequireRole("ServerAdmins");
        });
}

另见docs on authorization

【讨论】:

  • 嗯,对不起,我应该在 OP 中更清楚。因此,让我们使用您的策略授权示例。在我单独的 Web API 应用程序中,我在 Startup 中声明了该策略并授权了一些 API 方法。它可以工作,现在托管在“webapi.foo.com”,太棒了。现在假设我创建了一个新的、单独的 Web 应用程序,并且我想使用该 API 中的一些方法。所以我想我的问题有两个:如何在“webapi.foo.com”上调用这些方法?以及如何确保我的应用有权调用这些授权方法?
  • 我认为您应该编辑您的问题以使其更清楚,似乎您应该查看 jwt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2021-12-04
  • 2018-10-15
  • 2018-11-30
  • 2021-10-02
  • 2019-04-21
相关资源
最近更新 更多