Проверка подлинности ASP.NET Core 2.2 JWT - PullRequest
5 голосов
/ 16 апреля 2019

Недавно я узнал о ASP.NET Core 2.2 и пытался разработать образец входа на основе ролей (Website + Web API) с использованием токена JWT.

Определение простое:

  • если роль пользователя "admin", то он перенаправляет на страницу администратора.
  • если роль пользователя "user", то она перенаправляет на страницу пользователя.

Но большинство решений и статей, которые я нашел на «токене JWT с ASP.NET Core 2.2», предназначены только для веб-API.

Я почти понял, как работает токен JWT и как реализовать его на стороне Web API из следующей статьи:

http://jasonwatmore.com/post/2019/01/08/aspnet-core-22-role-based-authorization-tutorial-with-example-api

Теперь моя проблема заключается в том, как использовать вышеуказанный API-интерфейс с помощью ASP.NET Core Website?

Это может быть простой проблемой для многих парней, но я довольно плохо знаком с веб-разработкой и не понимаю многих вещей.

Любая помощь будет принята с благодарностью. Заранее спасибо.

1 Ответ

0 голосов
/ 19 апреля 2019

Используя руководство, я разместил в комментариях. Это не все, что вам нужно, но я не могу разместить код в комментариях. Нужна длинная форма.

Вы используете претензии, чтобы получить роль в свой токен.

В вашем стартапе.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(){ }
...