DefaultAzureCredential: Akses grafik dilarang dengan Kredensial Kode VisualStudio

Saya mencoba membaca properti pengguna dari grafik ms di dalam fungsi Azure. Untuk otentikasi saya menggunakan kelas DefaultAzureCredential dari Azure.Identity.

Akses dengan Kredensial Cache Token Bersama secara lokal dan Kredensial Identitas Terkelola di Azure tidak menjadi masalah! Saya ingin menggunakan Kredensial Kode Visual Studio, tetapi saya mendapatkan Authorization_RequestDenied! Hak istimewa tidak mencukupi untuk menyelesaikan pesan kesalahan operasi saat saya memanggil API grafik.

Masalahnya tampaknya adalah token akses yang saya terima dengan Kredensial VS Code. Akun penggunanya sama dengan yang saya gunakan dengan Kredensial Cache Token Bersama.

Ada ide? Terima kasih.

Kode:

DefaultAzureCredentialOptions options = new DefaultAzureCredentialOptions();
options.VisualStudioCodeTenantId = Environment.GetEnvironmentVariable("Debug_VisualStudioCodeTenantId");


var credential = new DefaultAzureCredential(options);
token = credential.GetToken(
                    new Azure.Core.TokenRequestContext(
                        new[] { "https://graph.microsoft.com/.default" }));

accessToken = token.Token;


var graphServiceClient = new GraphServiceClient(
            new DelegateAuthenticationProvider((requestMessage) =>
            {
                requestMessage
                .Headers
                .Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                return Task.CompletedTask;
            }));

var users = await graphServiceClient.Users.Request().GetAsync(); // throw the forbidden exception

Pengecualian: Kode: Authorization_RequestDenied\r\nPesan: Hak istimewa tidak mencukupi untuk menyelesaikan operasi.\r\nKesalahan batin:\r\n\tData Tambahan:\r\n\ttanggal: 20-04-2021T08: 02:23\r\n\trequest-id: ...\r\n\tclient-request-id: ...\r\nClientRequestId: ...\r\n


comment
Bisakah Anda memeriksa token di mis. jwt.ms? Pastikan dari sana bahwa token berisi semua hal yang seharusnya, seperti klaim scp harus berisi cakupan yang diperlukan.   -  person juunas    schedule 20.04.2021
comment
Saya baru dalam otentikasi berbasis token, jadi saya tidak yakin apa isi token. Tag scp berisi email Mail.ReadWrite Mail.Kirim profil openid Tasks.ReadWrite. Mungkinkah masalahnya saya perlu mendaftarkan kode VS di Azure atau semacamnya?   -  person Jonas    schedule 20.04.2021
comment
Sepertinya itu mungkin kehilangan cakupan yang dibutuhkan. Masalahnya adalah perwakilan layanan yang digunakan VS Code (pendaftaran aplikasinya) tidak memerlukan hal itu. Ini adalah masalah umum dalam menggunakan kredensial ini secara lokal:\ Anda mungkin perlu mencoba jenis kredensial lain atau menggunakan autentikasi kredensial klien (rahasia/sertifikat).   -  person juunas    schedule 20.04.2021
comment
Sayang sekali. Tapi terima kasih atas bantuan Anda.   -  person Jonas    schedule 20.04.2021
comment
Saya kira Anda juga bisa mencoba https://graph.microsoft.com/User.Read.All sebagai cakupannya alih-alih .default. Itu mungkin berakhir dengan kesalahan :\   -  person juunas    schedule 20.04.2021
comment
Ya, seperti kata @juunas coba tambahkan User.Read.All. Anda tidak memiliki izin yang diperlukan di token Anda dan menurut saya itulah masalahnya.   -  person Shiva Keshav Varma    schedule 20.04.2021
comment
Ketika saya melakukan itu saya mendapatkan pesan pengecualian ini: Otentikasi VisualStudioCodeCredential gagal: AADSTS65002: Persetujuan antara aplikasi pihak pertama '...' dan sumber daya pihak pertama '...' harus dikonfigurasi melalui praotorisasi - aplikasi yang dimiliki dan dioperasikan oleh Microsoft harus mendapatkan persetujuan dari pemilik API sebelum meminta token untuk API tersebut.   -  person Jonas    schedule 20.04.2021


Jawaban (1)


Setelah memeriksa token yang dikembalikan oleh VS Code, tampaknya token tersebut tidak memiliki izin/cakupan delegasi yang diperlukan. Dokumen mengatakan salah satu dari ini diperlukan untuk membuat daftar pengguna:

Pengguna.ReadBasic.All, Pengguna.Baca.Semua, Pengguna.ReadWrite.All, Direktori.Baca.Semua, Direktori.ReadWrite.All, Direktori.AccessAsUser.All

Karena perwakilan layanan yang digunakan VS Code tidak memerlukan semua ini, maka layanan tersebut tidak akan berfungsi. Setelah mencoba mendapatkan token secara eksplisit dengan cakupan yang diperlukan, sepertinya itu juga tidak berhasil.

Jadi kredensial VS Code saat ini sepertinya tidak berfungsi untuk tujuan ini. Anda memerlukan kredensial yang berbeda atau mungkin menggunakan kredensial rahasia/sertifikat klien dengan pendaftaran aplikasi Anda sendiri.

person juunas    schedule 20.04.2021
comment
Terima kasih atas bantuan ekstensif Anda. Untuk proses debug lokal, Kredensial Cache Token Bersama berfungsi sebagai alternatif. Sayangnya Kredensial Visual Studio tidak berfungsi. - person Jonas; 20.04.2021