我有一个工作Asp。. NET核心的WebApi服务和一个可以从ASP. NET调用的WebApi服务。. 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"));
});
}
My Controller is secured so:
[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 } };
}
我不确定问题是否在于我需要一种在调用中传递声明给包装器的方法,或者是否在我的服务设置中以及它如何检测声明。
请尝试指定索赔的值,如允许的电子邮件地址。这里建议- https://docs.asp.net/en/latest/security/authorization/claims.html
重复代码
options.AddPolicy("Founders", policy => policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
未经身份验证无法进行授权。您需要首先对用户进行身份验证,然后查看其身份以授予访问权限。
如果您的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应该包含一个"email"声明。
你可以看看asp.net Core的例子:https://github.com/aspnet/Security/blob/dev/samples/JwtBearerSample/Startup.cs L67