.net core 2.2 Не удалось получить токен JWT из запроса - PullRequest
0 голосов
/ 11 июля 2019

У меня есть веб-приложение asp.net, использующее бритвенные страницы с PageModel.Мне нужен доступ к веб-службе REST для получения токена JWT

Это моя конфигурация службы в Startup.cs

services.AddIdentity<AppUser, AppUserRole>(cfg =>
            {
                cfg.User = new UserOptions() { };
                cfg.User.RequireUniqueEmail = false;
                cfg.SignIn.RequireConfirmedEmail = false;

            })
           .AddUserManager<AppUserManager<AppUser>>()
           .AddUserStore<AppUserStore>()
           .AddRoleStore<AppRoleStore>()
           .AddDefaultTokenProviders();

            services.Configure<TokenOptions>(Configuration.GetSection("TokenConf"));
            var tokenConf = Configuration.GetSection("TokenConf").Get<TokenConf>();

            services.Configure<AppConf>(Configuration.GetSection("AppConf"));
            var appConf = Configuration.GetSection("AppConf").Get<AppConf>();

            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
                    .AddJwtBearer(options =>
                    {
                        options.RequireHttpsMetadata = false;
                        options.SaveToken = true;
                        options.TokenValidationParameters = new TokenValidationParameters
                        {

                            ValidateIssuer = false,
                            ValidateAudience = false,
                            ValidIssuer = tokenConf.Issuer,
                            ValidAudience = tokenConf.Audience,
                            IssuerSigningKey = new SymmetricSecurityKey(
                                Encoding.UTF8.GetBytes(appConf.JWTSecretKey))
                        };

                    })
                .AddCookie();


            services.AddSingleton<IAuthenticationServiceProxy, AuthenticationServiceProxy>();

            services.AddHttpContextAccessor();
            services.AddMemoryCache();//alternatively we can use services.AddDistributedMemoryCache() and IDistributedCache cache
            services.AddSession(options =>
            {
                options.Cookie.HttpOnly = true;
                options.Cookie.IsEssential = true;
            });


            services.AddOptions();

            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => false; 
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AuthorizePage("/Index");
                options.Conventions.AuthorizePage("/Privacy");
                options.Conventions.AllowAnonymousToPage("/Account/Login");

            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Это мой код входа в систему LoginModel : PageModel

  public async Task<IActionResult> OnPostAsync(string returnUrl, string handler)
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            var appUser = new AppUser() { UserName = UserLogin.Username };

            var result = await _signInMgr.PasswordSignInAsync(appUser, UserLogin.Password, false, false);//_signInMgr.PasswordSignInAsync(UserLogin.Username, UserLogin.Password, false, false);

            if (result.Succeeded)
            {
                var userTokenData = _authServPrx.GetTokenData(_appConf.Value.CslLink, UserLogin.Username, UserLogin.Password);
                JwtSecurityToken jwtSecurityToken = new JwtSecurityToken(userTokenData.Token);
                var jwt = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);

                new OkObjectResult(jwt);
            }
            else
                return BadRequest("Bad username or password"); //TODO: better return 

            return Page();
        }

Это не работает, перенаправление не происходит, но каким-то образом устанавливается cookie-файл аутентификации.Поэтому, если я затем вручную перехожу к /Index
, я достигаю

public void OnGet()
{
var accessToken = Request.Headers["Authorization"];
}

Но accessToken пуст.Я просто хочу перенаправить и получить доступ к своему токену.
Я что-то не так делаю?

1 Ответ

0 голосов
/ 12 июля 2019

Это зависит от того, где вы хотите хранить токен, сессию, кэш .... Например, вы можете передать строку запроса:

if (result.Succeeded)
{
    var userTokenData = _authServPrx.GetTokenData(_appConf.Value.CslLink, UserLogin.Username, UserLogin.Password);
    JwtSecurityToken jwtSecurityToken = new JwtSecurityToken(userTokenData.Token);
    var jwt = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);

    return LocalRedirect(returnUrl+"?token="+jwt);
}

и получить токен на странице:

public void OnGet(string token)
{

}
...