Доступ к API REST SharePoint с использованием аутентификации Azure AD, с использованием шаблона аутентификации ASP.net core 2.1 MVC WebApp - PullRequest
0 голосов
/ 03 октября 2018

Шаблон выполняет всю аутентификацию, получает токен доступа (угадайте его на основе клиента, помогите!), Но использование его для вызова API API не работает,

            services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                // Instead of using the default validation (validating against a single issuer value, as we do in
                // line of business apps), we inject our own multitenant validation logic
                ValidateIssuer = false,

                // If the app is meant to be accessed by entire organizations, add your issuer validation logic here.
                //IssuerValidator = (issuer, securityToken, validationParameters) => {
                //    if (myIssuerValidationLogic(issuer)) return issuer;
                //}
            };
            options.GetClaimsFromUserInfoEndpoint=true;
            options.SaveTokens = true;

            //options.Scope.Add("testapi");
            options.Scope.Add("offline_access");
          //  options.ResponseType = "code id_token";

            options.Events = new OpenIdConnectEvents
            {
                OnTicketReceived = context =>
                {
                     // If your authentication logic is based on users then add your logic here
                     return Task.CompletedTask;
                },
                OnAuthenticationFailed = context =>
                {
                    context.Response.Redirect("/Error");
                    context.HandleResponse(); // Suppress the exception
                     return Task.CompletedTask;
                },
                //OnTokenResponseReceived = context => 
                //{
                //    JustChecking(context);
                //    return Task.CompletedTask;
                //},
                //If your application needs to do authenticate single users, add your user validation below.
               OnTokenValidated = context =>
               {

                   var accessToken = context.SecurityToken as JwtSecurityToken;
                   if (accessToken != null)
                   {     
                       ClaimsIdentity identity = context.Principal.Identity as ClaimsIdentity;
                       if (identity != null)
                       {
                           identity.AddClaim(new Claim("access_token", accessToken.RawData));
                       }
                   }
                   JustChecking(context);
                   return Task.CompletedTask;
               }


                //OnTokenResponseReceived = context =>
                //{
                //    var toks = context.TokenEndpointResponse.AccessToken;
                //    var toks2 = context.TokenEndpointResponse.IdToken;
                //    return Task.CompletedTask;
                //},
            };


        });


        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();



        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

попытался получить несколько вещейтокен доступа, я не уверен, что это тот, который мне нужен, пожалуйста, дайте мне знать, если есть лучшие способы получить access_token внутри контроллера, и если есть способ, который я могу запросить специально для токена доступа sharepoint, любые полезные ресурсы приветствуются, спасибо

        public async Task<HttpResponseMessage> callSP() {

        var acToken = User.Claims.FirstOrDefault(c => c.Type == "access_token")?.Value;
        // var acessToken = await HttpContext.Authentication.GetAuthenticateInfoAsync();

        //  ClientContext clientContext = TokenHelper.GetClientContextWithAccessToken(targetWeb, AccessToken);
        using (HttpClient client = new HttpClient())
        {

            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", acToken);

            var result = await client.GetAsync("https://sharepointSite/_api/web/lists");
            return result;
        }
...