.ASP.NET Core + react-redux authentication and authorization

0

Cześć.
Mam kilka pytań, próbuję zrobić prostą apkę (co ona robi nie jest istotne) w której chcę umożliwić logowania się użytkowników z różnymi rolami. Jest to temat dla mnie nowy, ogólny zamysł rozumiem, jednak jak to się dzieje w tle dzieje się jest nieco dla mnie zagadką. Ale po kolei.

Po stronie ASP.NET CORE chciałbym użyć JWT mniej więcej w takiej konfiguracji jak w linku poniżej :

Jednak zastanawiam się skąd atrybuty : [Authorize] [Authorize(Roles="rola")] skąd rozpoznają, że użytkownik jest zalogowany?

Wydaje mi się (jednak proszę o poprawienie), że Autoryzacja jest rozpoznawana na podstawie wygenerowanego tokenu, który jest ustawiony w appsettings i w tej sekcji w pliku Startup.cs

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            // configure strongly typed settings objects
            var appSettingsSection = Configuration.GetSection("AppSettings");
            services.Configure<AppSettings>(appSettingsSection);

            // configure jwt authentication
            var appSettings = appSettingsSection.Get<AppSettings>();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

            // configure DI for application services
            services.AddScoped<IUserService, UserService>();
        }

Jednak nie jestem co do tego pewny.
Czy tak jak w linku w którym podałem, token powienien być umieszczony w header przy każdym requescie (każdym w którym jakaś autoryzacja będzie wymagana?).
Jak sprawdzana jest rola w takim razie? Poprzez jakieś pole "role" w User, które jest przesyłane wraz z tokenem?
Ogólnie zastanawiam się co musi umieszczane i gdzie przy każdym requeście by backend rozpoznał użytkownika i jego role przy użyciu atrybutów : [Authorize] [Authorize(Roles="rola")] przy użyciu JWT Token.
Do frontu używam Reacta, jednak wydaję mi się, że ot nie ma znaczenia, tak długo jak jest to technologia umożliwiająca wysyłanie zapytań.

Pozdrawiam ;)

0

To co tu napisałeś nie generuje jeszcze żadnego JWT. To musisz napisać sobie. Trzeba 'skonfigurować' Claimsy' w których jest / są zawarte role user name itp. To jest zakodowane potem w JWT w PAYLOAD. I jak przychodzi żądanie z nagłówkiem Bearer to backend odkodowuje sobie to i wie jaką masz role.
tak wygląda przy jwt atrybut autorize:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "ADMINISTRATOR")]

Nie ma znaczenia czego użyjesz na froncie. Pamiętaj tylko żeby JWT zapisać w jakimś storage, żeby po odświeżeniu strony nie zniknął Ci ;)

Tak u mnie wygląda generowanie tokenu po poprawnym logowaniu

private string GenerateJwtToken(User user, IList<string> roles)
        {
            var claims = new List<Claim>()
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(JwtRegisteredClaimNames.Email, user.Email),
                new Claim(ClaimTypes.NameIdentifier, user.Id),
                new Claim(ClaimTypes.Name, user.UserName),
                new Claim(ClaimTypes.Email, user.Email),
            };
            foreach (string role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role.ToUpper()));
            }
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_JwtSettings.Value.JwtKey));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            

            var token = new JwtSecurityToken(
                _JwtSettings.Value.JwtIssuer,
                _JwtSettings.Value.JwtIssuer,
                claims,
                expires: DateTime.Now.AddMinutes(720),
                signingCredentials: creds
            );

            return new JwtSecurityTokenHandler().WriteToken(token);
        }

Jak już będziesz miał mechanizm to możesz podejrzeć na tej stronie swój JWT https://jwt.io/

0

Jednak zastanawiam się skąd atrybuty : [Authorize] [Authorize(Roles="rola")] skąd rozpoznają, że użytkownik jest zalogowany?

Tutaj fajny wpis na ten temat: Exploring the cookie authentication middleware in ASP.NET Core

Tutaj coś z dokumentacji, ale zbyt wiele informacji tu nie ma.

Microsoft.AspNetCore.Authentication.JwtBearer

JwtBearerHandler <-- Szczególnie tutaj

JwtBearerEvents

Oraz tutaj Authentication

1 użytkowników online, w tym zalogowanych: 0, gości: 1