Внешние пользователи MVC Core 2 и токен доступа - PullRequest
0 голосов
/ 04 мая 2018

Я новичок в Dot Net Core 2 и реализации клиента MVC и IdentityServer4.

столкнулся с двумя проблемами при получении токена доступа внешнего пользователя.

задача 1

services.AddAuthentication(options =>
             { 
                 options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                 options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                 //options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
             })

при добавлении ниже строки кода

options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 

пользователь не может войти даже после успешной аутентификации в ExternalLoginCallback

Задача 2

Если я удалил вышеуказанную строку кода, пользователь может войти в систему, но await HttpContext.GetTokenAsync("access_token") возвращает ноль.

Вот полный код для запуска. C

public void ConfigureServices(IServiceCollection services)
        { 


             services.AddAuthentication(options =>
             { 
                 options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                 options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                 //options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;   

             })
           .AddCookie()
           .AddGoogle(googleOptions =>
           {
               googleOptions.ClientId = Configuration["Authentication:Google:ClientId"];
               googleOptions.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
               googleOptions.SaveTokens = true; 
           })
            .AddOpenIdConnect(options =>
            { 
                options.Authority = "http://localhost:xxx/";  
                options.RequireHttpsMetadata = false;  
                options.ClientId = "xxx"; 
                options.ClientSecret = "xxx";
                options.ResponseType = "code id_token";  
                options.Scope.Add("xxxx");
                options.Scope.Add("email");
                options.Scope.Add("offline_access");
                options.GetClaimsFromUserInfoEndpoint = true;
                options.SaveTokens = true;


            });

            services.AddMvc();
        } 
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {

            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvcWithDefaultRoute(); 
        }

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 04 мая 2018

Вот запуск из моего веб-приложения mvc, которое подключается к Identity Server 4. Обратите внимание на .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)

Setup.cs

services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
             .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
            {
                //options.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"C:\temp-keys\"));
                // when the identity has been created from the data we receive,
                // persist it with this authentication scheme, hence in a cookie
                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                // Identity server endpoint
                options.Authority = settingsSetup.IdentityServerEndpoint;
                // Turns off HTTPS requirement becouse i CBA to set up visual studio.
                options.RequireHttpsMetadata = false;
                // Client id to login with
                options.ClientId = settingsSetup.ClientId;
                // Client secret.
                options.ClientSecret = settingsSetup.Secret;

                // Scope of our API
                options.Scope.Add("testapi");
                options.Scope.Add("devconsole");
                // adding offline_access to get a refresh token
                options.Scope.Add("offline_access");

                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
            });
        services.AddAuthorization();

От вашего контроллера вы сможете получить значения таким образом.

var accessToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken);
var refreshToken = await HttpContext.GetTokenAsync(IdentityConstants.HttpContextHeaders.RefreshToken);
var idToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.IdToken);
...