Ошибка 404 после проверки подлинности Apple с использованием OpenId Connect - PullRequest
0 голосов
/ 21 апреля 2020

Принимая от scottbrady91.com, я пытаюсь использовать внешнюю аутентификацию Apple на нашем сайте. У меня работал Microsoft, но пока не Apple. Пользователь уже перенаправлен на appleid.apple.com, но после аутентификации он возвращается на https://iluvrun.com/signin-apple (что правильно), но это не обрабатывается, и пользователь получает ошибку 404.

Если честно, я не знаю, как работают signin-facebook, signin-google или signin-oid c, но они просто работают. Поэтому у меня возникают проблемы с выяснением, почему signin-apple не обрабатывается.

Сайт создан с использованием ASP. NET веб-форм. Ниже приведено то, что у меня есть на Startup.Auth.cs:

namespace ILR
{
    public partial class Startup {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login")
            });

            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions("Apple")
                {
                    ClientId = "com.iluvrun.login",
                    Authority = "https://appleid.apple.com/auth/authorize",
                    SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
                    RedirectUri = "https://iluvrun.com/signin-apple",
                    PostLogoutRedirectUri = "https://iluvrun.com",
                    Scope = "name email",
                    ResponseType = OpenIdConnectResponseType.Code,
                    ResponseMode = OpenIdConnectResponseMode.FormPost,
                    CallbackPath = PathString.FromUriComponent("/signin-apple"),
                    Configuration = new OpenIdConnectConfiguration
                    {
                        AuthorizationEndpoint = "https://appleid.apple.com/auth/authorize",
                        TokenEndpoint = "https://appleid.apple.com/auth/token"
                    },
                    TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidIssuer = "https://appleid.apple.com",
                        IssuerSigningKey = new JsonWebKeySet(GetKeysAsync().Result).Keys[0]
                    },
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        AuthorizationCodeReceived = (context) =>
                        {
                            context.TokenEndpointRequest.ClientSecret = TokenGenerator.CreateNewToken();

                            return Task.CompletedTask;
                        },
                        AuthenticationFailed = (context) =>
                        {
                            context.HandleResponse();
                            context.Response.Redirect("/Account/Login?errormessage=" + context.Exception.Message);

                            return Task.FromResult(0);
                        }
                    },
                    ProtocolValidator = new OpenIdConnectProtocolValidator
                    {
                        RequireNonce = false,
                        RequireStateValidation = false
                    }
                }
            );
        }

        private static async Task<string> GetKeysAsync()
        {
            string jwks = await new HttpClient().GetStringAsync("https://appleid.apple.com/auth/keys");

            return jwks;
        }
   }

    public static class TokenGenerator
    {
        public static string CreateNewToken()
        {
            const string iss = "CHM57Z5A6";
            const string aud = "https://appleid.apple.com";
            const string sub = "com.iluvrun.login";
            const string privateKey = "XXXX"; // contents of .p8 file
            CngKey cngKey = CngKey.Import(Convert.FromBase64String(privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);

            JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
            JwtSecurityToken token = handler.CreateJwtSecurityToken(
                issuer: iss,
                audience: aud,
                subject: new ClaimsIdentity(new List<Claim> { new Claim("sub", sub) }),
                expires: DateTime.UtcNow.AddMinutes(5),
                issuedAt: DateTime.UtcNow,
                notBefore: DateTime.UtcNow,
                signingCredentials: new SigningCredentials(new ECDsaSecurityKey(new ECDsaCng(cngKey)), SecurityAlgorithms.EcdsaSha256));

            return handler.WriteToken(token);
        }
    }
}

Кто-нибудь знает, что мне не хватает, чтобы заставить это работать?

...