ASP.Net Core - аутентификация JWT с WebAPI и внешним интерфейсом MVC не работает - PullRequest
0 голосов
/ 11 июня 2018

Проект состоит из двух частей:

  • ASP.Net Core API
  • ASP.Net Core MVC Frontend

По сути, что я хочусделать это аутентификация через JWT.Поэтому API выдает JWT, а внешний интерфейс MVC использует Identity с утверждениями и ролями, объявленными в JWT.

Startup.cs в API:

private const string SecretKey = "my_Secret_Key";
private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey));

            #region JWT Auth


        // jwt wire up
        // Get options from app settings
        var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));

        // Configure JwtIssuerOptions
        services.Configure<JwtIssuerOptions>(options =>
        {
            options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
            options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
        });

        var tokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],

            ValidateAudience = true,
            ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],

            ValidateIssuerSigningKey = true,
            IssuerSigningKey = _signingKey,


            RequireExpirationTime = false,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero
        };

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        }).AddJwtBearer(configureOptions =>
        {
            configureOptions.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            configureOptions.TokenValidationParameters = tokenValidationParameters;
            configureOptions.SaveToken = true;
        });

        // api user claim policy
        services.AddAuthorization(options =>
        {
            options.AddPolicy(Constants.Policies.ApiAccess, policy => policy.RequireClaim(Constants.JwtClaimIdentifiers.Rol, Constants.JwtClaims.ApiAccess));
        });

        #endregion

Генерация JWT:

        public async Task<string> GenerateEncodedToken(string userName)
    {

        User user = _userManager.GetUserByUserName(userName);
        List<string> userRoles = _userManager.GetRoles(user.Guid);

        var claimsToEncode = new[]
     {
             new Claim(JwtRegisteredClaimNames.Sub, userName),
             new Claim("web", user.WebId),
             new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
             new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
             new Claim(Constants.JwtClaimIdentifiers.Rol,Constants.JwtClaims.ApiAccess),
     };


        // Create the JWT security token and encode it.
        var jwt = new JwtSecurityToken(
            issuer: _jwtOptions.Issuer,
            audience: _jwtOptions.Audience,
            claims: claimsToEncode,
            notBefore: _jwtOptions.NotBefore,
            expires: _jwtOptions.Expiration,
            signingCredentials: _jwtOptions.SigningCredentials);


        jwt.Payload.Add("roles", userRoles.ToArray());

        var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);



        return encodedJwt;
    }

Авторизация работает как прелесть с этим в API.

Теперь я хочу сделать следующее: реализовать то же самое во внешнем интерфейсе, чтобы: внешний интерфейс MVC получал учетные данные, отправлял их в API, получите токен и авторизуйтесь с утверждениями и ролями в токене.

Я пробовал несколько вещей, но пока ни одна из них не сработала.Что я должен вставить в Startup.cs во внешнем интерфейсе, чтобы проверка подлинности выполнялась не против секретного ключа (который не разрешен для внешнего интерфейса), а против открытого ключа?Или мне нужно реализовать конечную точку в API, которая проверяет JWT удаленно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...