Веб-приложение ASP.NET с JwtBearerAuthenticationOptions и OpenIdConnectAuthenticationOptions - PullRequest
0 голосов
/ 05 октября 2019

При наличии стороннего поставщика удостоверений (например, okta / auth0) возможно ли, чтобы веб-приложение на платформе asp.net (не ядро) разрешало аутентификацию потока кода для пользователей, которые непосредственно заходят на сайт, и неявного потока для клиентского веб-сайта javascriptприложения (например, vue.js) одновременно подключаются к веб-API (используя токен-аутентификацию)?

то есть я могу настроить свое веб-приложение asp.net с помощью jwt для аутентификации API-интерфейса из vue.js, и это работает нормально. через ...

 app.UseCors(CorsOptions.AllowAll);


            var keyResolver = new OpenIdConnectSigningKeyResolver(domain);
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidAudience = apiIdentifier,
                        ValidIssuer = domain,
                        IssuerSigningKeyResolver = (token, securityToken, kid, parameters) => keyResolver.GetSigningKey(kid)
                    }
                });

            // Configure Web API
            WebApiConfig.Configure(app);

Я также могу настроить то же веб-приложение для использования потока кода для пользователей, которые обращаются к веб-приложению напрямую для доступа к авторизованным ресурсам через

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
            LoginPath = new PathString("/Account/Login")
        });
    // Configure Auth0 authentication
    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        AuthenticationType = "Auth0",
        Authority = $"https://{auth0Domain}",
        ClientId = auth0ClientId,
        ClientSecret = auth0ClientSecret,
        RedirectUri = auth0RedirectUri,
        PostLogoutRedirectUri = auth0PostLogoutRedirectUri,
        //ResponseType = OpenIdConnectResponseType.CodeIdToken,

        //This will inform the OpenID Connect middleware to extract the Access Token and store it in the ProtocolMessage
        ResponseType = OpenIdConnectResponseType.CodeIdTokenToken,
        Scope = "openid profile email",
        TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = "name"
        },
        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            SecurityTokenValidated = notification =>
            {
                notification.AuthenticationTicket.Identity.AddClaim(new Claim("id_token", notification.ProtocolMessage.IdToken));
                notification.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", notification.ProtocolMessage.AccessToken));

                return Task.FromResult(0);
            },
            RedirectToIdentityProvider = notification =>
            {
                if (notification.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
                {
                    notification.ProtocolMessage.SetParameter("audience", "https://dev--i3w6o4q.auth0.com/api/v2/");
                }

                if (notification.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
                {
                    var logoutUri = $"https://{auth0Domain}/v2/logout?client_id={auth0ClientId}";
                    var postLogoutUri = notification.ProtocolMessage.PostLogoutRedirectUri;
                    if (!string.IsNullOrEmpty(postLogoutUri))
                    {
                        if (postLogoutUri.StartsWith("/"))
                        {
                            // transform to absolute
                            var request = notification.Request;
                            postLogoutUri = request.Scheme + "://" + request.Host + request.PathBase + postLogoutUri;
                        }

                        logoutUri += $"&returnTo={ Uri.EscapeDataString(postLogoutUri)}";
                    }

                    notification.Response.Redirect(logoutUri);
                    notification.HandleResponse();
                }

                return Task.FromResult(0);
            }
        }
    });

Проблема / проблема в том, что я хочу объединить эти подходы в одном веб-приложении asp.net. Это возможно?

...