Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JWT身份验证如何在单独的API项目而不是AuthServer项目中验证http请求_C#_Asp.net Web Api_Asp.net Core_Jwt - Fatal编程技术网

C# JWT身份验证如何在单独的API项目而不是AuthServer项目中验证http请求

C# JWT身份验证如何在单独的API项目而不是AuthServer项目中验证http请求,c#,asp.net-web-api,asp.net-core,jwt,C#,Asp.net Web Api,Asp.net Core,Jwt,特别是读了几篇文章之后 我制作了自己的ASP.NET核心解决方案 1个项目(AuthServer),用于认证和授权,以及 1个项目(WebApi)用于我整个项目中其余的API 问题是: 如何在我的WebApi项目中验证http请求? 我知道,一旦用户通过身份验证,客户端将持有令牌,对于后续请求,它们都需要传递int令牌,在服务器端,它会通过AuthServer项目的Startup.cs中的以下代码验证这些请求: services.AddAuthentication(x =>

特别是读了几篇文章之后

我制作了自己的ASP.NET核心解决方案

1个项目(AuthServer),用于
认证
授权
,以及

1个项目(WebApi)用于我整个项目中其余的API

问题是: 如何在我的WebApi项目中验证http请求?

我知道,一旦用户通过身份验证,客户端将持有令牌,对于后续请求,它们都需要传递int令牌,在服务器端,它会通过AuthServer项目的Startup.cs中的以下代码验证这些请求:

services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x=> {
            x.Events = new JwtBearerEvents
            {
                OnTokenValidated = context =>
                {
                    var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
                    var userId = context.Principal.Identity.Name;
                    var user = userService.GetById(userId);
                    if(user == null)
                    {
                        context.Fail("Unauthorized");
                    }
                    return Task.CompletedTask;
                }
            };
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false
            };
            
        });
那么我应该做什么来验证WebApi项目中的令牌呢?
通过每次请求传入时调用my
AuthServer
项目中的Authenticate端点,然后在WebApi中执行代码?

我假设您要运行两个单独的ASP.NET应用程序。 您可以通过向您的
AuthServer
发送http请求来验证到达
WebApi
的请求。 您可以创建一个自定义属性,该属性将执行此任务。 在WebApi项目中:

使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.Filters;
使用Microsoft.Extensions.Primitives;
使用System.Collections.Generic;
使用System.Linq;
使用System.Net.Http;
使用System.Security.Claims;
使用System.Threading.Tasks;
名称空间YourNamespace
{
公共类YourCustomAttribute:TypeFilterAttribute
{ 
公共属性(
:base(typeof(AuthFilter))
{
参数=新对象[]{
//参数被传递给AuthFilter构造函数,
};
}
}
公共类AuthFilter:IAsyncAuthorizationFilter
{
私有静态只读HttpClient http=新HttpClient();
公共AuthFilter()
{
}
//更改它以符合您的逻辑
AuthorizationAsync(AuthorizationFilterContext上下文)上的公共异步任务
{
var authorizationHeader=context.HttpContext.Request.Headers[“authorization”];
if(authorizationHeader==StringValues.Empty)
{
context.Result=新的UnauthorizedResult();
}
其他的
{
var response=wait http.GetAsync(
“您的AuthServer地址/login/?token=“+authorizationHeader.ToString(),
HttpCompletionOption.ResponseHeadersRead//因为我们只需要状态代码
);
if(response.StatusCode!=System.Net.HttpStatusCode.OK)
{
context.Result=新结果();
}
}
}
}
}
假设您在AuthServer项目的
LoginController
中有以下端点

[HttpGet]
公共IActionResult ValidateToken(字符串标记)
{
//你的逻辑在这里
}
属性用法与
[Authorize]
相同

也请查看此链接(我使用了其中的一些代码)。 它展示了如何手动验证Jwt令牌

您可能还需要在AuthServer项目中设置CORS,以允许WebApi发出请求
Startup.cs

public void配置服务(IServiceCollection服务)
{
services.AddCors(选项=>
{
options.AddPolicy(“AllowAllHeaders”,
生成器=>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、IServiceProvider服务提供商)
{
附录UseCors(“AllowAllHeaders”);
}

经过数小时的阅读,我发现了一篇关于是否将AuthServer与API服务器分离的文章


在大型商业项目中,最好将它们分开,但在我的情况下,这只是我的一个辅助项目,因此我最终将它们构建在一起以节省能源。

通常,您会让客户端首先调用您的身份验证API,从身份验证端点获取令牌,然后客户端将该令牌作为任何时候你去WebApi请求时,请求中的头值(承载令牌)。我认为如果你搜索任何类型的“JWT ASP.NET核心”您应该可以在WebApi端找到如何查找传入的身份验证令牌的示例。您好@BenKrueger谢谢您的回复。我再次搜索了,但所有的文章仍然将AutheServer和WebApi项目的实现作为一个项目来讨论。@Franva您可能希望运行两个单独的ASP.NET应用程序,其中一个将处理授权,还有剩下的逻辑?@Andriy是的。这是我读了很多文章后得到的印象。你能帮忙吗?谢谢。我建议你看看。使用它你可以设置一个合适的身份验证提供商(作为一个单独的服务器)还有一个安全的API服务器,您可以使用它进行身份验证。还将介绍您的情况。谢谢Andrey,我应该创建哪个项目?AuthServer还是WebApi?示例中使用的YourCustomAttribute在哪里?@Franva,在WebApi项目中声明并使用了属性。我应该创建哪个项目这个自定义属性?感谢您更新答案,是的,我已经设置了CORS:)@Franva,那么,在WebApi项目中创建一个属性类
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{ ....}