Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# ASP.NET Core 2.2 JWT身份验证_C#_Asp.net Core_Asp.net Core Mvc_Jwt Auth - Fatal编程技术网

C# ASP.NET Core 2.2 JWT身份验证

C# ASP.NET Core 2.2 JWT身份验证,c#,asp.net-core,asp.net-core-mvc,jwt-auth,C#,Asp.net Core,Asp.net Core Mvc,Jwt Auth,最近我一直在学习ASP.NET Core 2.2,并尝试使用JWT令牌开发一个基于角色的登录示例(网站+Web API) 定义很简单: 若用户的角色是“管理员”,那个么它会重定向到管理员页面 若用户的角色是“用户”,那个么它将重定向到用户页面 但我在“带ASP.NET Core 2.2的JWT令牌”上找到的大多数解决方案和文章都只针对Web API 从下面的文章中,我几乎了解了JWT令牌的工作原理以及如何在Web API端实现它: 现在我的问题是如何使用ASP.NET核心网站使用上述API

最近我一直在学习ASP.NET Core 2.2,并尝试使用JWT令牌开发一个基于角色的登录示例(网站+Web API)

定义很简单:

  • 若用户的角色是“管理员”,那个么它会重定向到管理员页面
  • 若用户的角色是“用户”,那个么它将重定向到用户页面
但我在“带ASP.NET Core 2.2的JWT令牌”上找到的大多数解决方案和文章都只针对Web API

从下面的文章中,我几乎了解了JWT令牌的工作原理以及如何在Web API端实现它:

现在我的问题是如何使用ASP.NET核心网站使用上述API

对于很多人来说,这可能是一个简单的问题,但我对web开发还相当陌生,对很多事情都不了解

任何帮助都将不胜感激。
提前感谢。

使用我在评论中发布的指南。这并不是你所需要的全部——但我不能在评论中发布代码。需要很长的表格

您可以使用声明将角色放入您的令牌中

在startup.cs中

   var secretKey = Configuration.GetSection("JWTSettings:SecretKey").Value;
    var issuer = Configuration.GetSection("JWTSettings:Issuer").Value;
    var audience = Configuration.GetSection("JWTSettings:Audience").Value;

    var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
    var tokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = signingKey,
        ValidateIssuer = true,
        ValidIssuer = issuer,
        ValidateAudience = true,
        ValidAudience = audience,
        ValidateLifetime = true,
        ClockSkew = TimeSpan.Zero,
    };

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = tokenValidationParameters;
    });
然后在您的控制器方法中,用户使用该方法“登录”或发出令牌

var claims = new[] {
                            new Claim(ClaimTypes.Name, Credentials.Email),
                            new Claim(ClaimTypes.Role, Role) };
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.SecretKey));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
                                issuer: _options.Issuer,
                                audience: _options.Audience,
                                claims: claims,
                                expires: DateTime.Now.AddYears(10),
                                signingCredentials: creds);
然后使用角色保护您的方法或控制器

 [Authorize(Roles = "Admin")]
   [HttpGet]
   Public IActionResult GrabStuff(){ }

因此,为了澄清,您可以在API端验证JWT(大概是通过
[Authorize]
控制器上的属性,但您想知道如何读取和使用应用程序前端部分的令牌吗?@CamiloTerevinto编辑以修复,只是一个错误。如果我理解正确,您有一个前端应用程序和一个分离的后端应用程序,因此这不是一个简单的问题。后端应用程序需要生成并验证JWTs,但前端应用程序是从ASP.NET Core还是从JavaScript调用后端应用程序?@UpQuark是的,没错,我想知道如何在前端应用程序上读取和使用令牌。@Camilotervin您的理解是正确的。我有单独的后端API和前端应用程序。我想在上调用Authenticate API登录按钮单击并从API获取令牌。我想从ASP.Net Core调用后端。这似乎是API端的代码。从API端发出令牌并声明,我没有遇到任何问题,问题是如何在客户端(网站)上使用该声明根据用户角色登录。