【问题标题】:Securing and accessing a .NET core WebApi service using OAuth2使用 OAuth2 保护和访问 .NET 核心 WebApi 服务
【发布时间】:2017-01-08 04:39:48
【问题描述】:

我有一个可用的 Asp.NET 核心 WebApi 服务和一个可以从 ASP.NET 核心 MVC 应用程序调用的服务。使用 AutoRest 生成的包装器调用该服务。该服务目前没有安全层,而网站使用 OAuth2 进行保护。

我在服务中添加了以下内容:

public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddMvc();

        // NEW Authorisation
        services.AddAuthorization(options =>
        {
            options.AddPolicy("ApiAccess", policy => policy.RequireClaim("email"));
        });

    }

我的控制器是安全的,所以:

[Authorize(Policy = "ApiAccess")]
public class StatusController : Controller

但是,当我调用 AutoRest 包装器时,我得到一个“未经授权”的异常:

try
        {
            var service = new StatusAPI(new Uri("http://localhost:17237/"));
            ViewData["State"] = service.ApiStatusGet();
        }
        catch (Exception ex)
        {
            ViewData["State"] = new[] { new ServiceStatus { Name = "Health API", Message = "Is unreachable " + ex.Message } };
        }

我不确定问题是否在于我需要一种方法来传递我对包装器的调用中的声明,或者它是否在我的服务设置中以及它如何检测声明。

【问题讨论】:

  • 是否有身份验证中间件或一些自定义代码填充主体中的电子邮件声明?
  • 理想情况下,我正在寻找一个展示需要如何配置的示例
  • 我没有看到您提供任何类型的包含电子邮件声明的令牌。这是StatusAPI 为您处理的事情吗?

标签: c# oauth-2.0 asp.net-core .net-core asp.net-core-webapi


【解决方案1】:

没有身份验证就无法进行自动化。 您需要先验证用户身份,然后查看其身份以授予访问权限。

如果您的 OAuth2 AS 提供了 JWT,则可以使用 JWT 身份验证中间件。

public void ConfigureServices(IServiceCollection services)
{
  // add the authentication dependencies
  services.AddAuthentication();
}

public void Configure(IApplicationBuilder app)
{
  app.UseJwtBearerAuthentication(new JwtBearerOptions
  {
     // configure your JWT authentication here
  });
}

当然,JWT 应该包含一个“电子邮件”声明。

您可以查看 ASPNET Core 示例: https://github.com/aspnet/Security/blob/dev/samples/JwtBearerSample/Startup.cs#L67

【讨论】:

    【解决方案2】:

    请尝试指定声明的值,例如允许的电子邮件地址。正如这里所建议的 - https://docs.asp.net/en/latest/security/authorization/claims.html

    重复代码

    options.AddPolicy("Founders", policy => policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));

    【讨论】:

    • 据我所知,这只是限制了索赔的有效价值,据我所知,我没有任何索赔通过
    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 2015-07-08
    • 2022-10-13
    • 2020-09-08
    • 2020-12-15
    • 2017-12-19
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多