Aspnet Core 1.1 перейти на новый вход в Google - PullRequest
0 голосов
/ 28 февраля 2019

Я создал веб-приложение AspnetCore 1.1, и мне нужно перенести аутентификацию из Google + Войти в новый вход в Google.Я нашел в Интернете много предложений по AspNet Core 2.x, но ни одного по AspNet Core 1.x.Одним из таких предложений было добавить следующий код в класс запуска:

services.AddAuthentication().AddGoogle(googleOptions =>  
{  
    googleOptions.ClientId = Configuration["Authentication:Google:ClientId"];  
    googleOptions.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
    googleOptions.UserInformationEndpoint = "https://openidconnect.googleapis.com/v1/userinfo";
    googleOptions.ClaimActions.Clear();
    googleOptions.ClaimActions.MapJsonKey(ClaimTypes.Name, "email");
    googleOptions.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_Name");
    googleOptions.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_Name");
    googleOptions.ClaimActions.MapJsonKey("urn:google:profile", "profile");
    googleOptions.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
    googleOptions.ClaimActions.MapJsonKey("urn:google:image", "picture");
    googleOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub");
});

В этом случае моя проблема заключается в том, что в AspNet Core 1.x у меня нет метода ClaimActions.MapJsonKey () иЯ не знаю, как перевести этот код для Core 1.x.

Может кто-нибудь мне помочь?Есть ли другое решение для AspNet Core 1.x?

Заранее спасибо

1 Ответ

0 голосов
/ 28 февраля 2019

При внесении изменений всегда проверяйте Объявления ядра ASP.NET Репозиторий GitHub.

Microsoft.Owin с веб-формами ASP.NET и MVC Для Microsoft.Owin 3.1.0 и более поздних версий в общих чертах указано здесь .Приложения должны выполнить немедленное тестирование с митигацией, чтобы проверить изменения в формате данных.Мы планируем выпустить Microsoft.Owin 4.0.1 с исправлением для этого как можно скорее.Приложения, использующие любую предыдущую версию, должны будут обновиться до 4.0.1.

ASP.NET Core 1.x Меры по устранению, приведенные выше для Microsoft.Owin , также можно адаптировать для ASP.NET Core.1.х.Поскольку 1.x приближается к концу срока службы и имеет низкое использование, нет планов исправления пакетов NuGet для этой проблемы.

Ссылки в проблеме отображаются на этот комментарий .

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
    ClientId = Environment.GetEnvironmentVariable("google:clientid"),
    ClientSecret = Environment.GetEnvironmentVariable("google:clientsecret"),
    UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo",
    BackchannelHttpHandler = new GoogleUserInfoRemapper(new WebRequestHandler())
});

и

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace Katana.Sandbox.WebServer
{
    internal class GoogleUserInfoRemapper : DelegatingHandler
    {
        public GoogleUserInfoRemapper(HttpMessageHandler innerHandler) : base(innerHandler) { }

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var response = await base.SendAsync(request, cancellationToken);

            if (!request.RequestUri.AbsoluteUri.Equals("https://www.googleapis.com/oauth2/v2/userinfo"))
            {
                return response;
            }

            response.EnsureSuccessStatusCode();
            var text = await response.Content.ReadAsStringAsync();
            JObject user = JObject.Parse(text);
            JObject legacyFormat = new JObject();

            JToken token;
            if (user.TryGetValue("id", out token))
            {
                legacyFormat["id"] = token;
            }
            if (user.TryGetValue("name", out token))
            {
                legacyFormat["displayName"] = token;
            }
            JToken given, family;
            if (user.TryGetValue("given_name", out given) && user.TryGetValue("family_name", out family))
            {
                var name = new JObject();
                name["givenName"] = given;
                name["familyName"] = family;
                legacyFormat["name"] = name;
            }
            if (user.TryGetValue("link", out token))
            {
                legacyFormat["url"] = token;
            }
            if (user.TryGetValue("email", out token))
            {
                var email = new JObject();
                email["value"] = token;
                legacyFormat["emails"] = new JArray(email);
            }
            if (user.TryGetValue("picture", out token))
            {
                var image = new JObject();
                image["url"] = token;
                legacyFormat["image"] = image;
            }

            text = legacyFormat.ToString();
            response.Content = new StringContent(text);
            return response;
        }
    }
}
...