#c# #.net #sharepoint
Вопрос:
Я пытаюсь перенести свои коды с .Net 4.7 на .Net core, потому что я думаю, что сейчас это тенденция для приложений sharepoint. Мои коды используют CSOM в .NET 4.7. Но я совершенно новичок в .Net Core и Azure AD. Я зарегистрировал свое приложение в Azure AD и получил свой идентификатор клиента. Теперь я хочу только сначала протестировать, например, получить свои коды для связи с моим сайтом SharePoint. Сейчас я получаю ошибку ниже.
Unhandled exception. System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.Text.Json.JsonElement.GetProperty(String propertyName)
at CSOM_core_test.Program.Main(String[] args) in C:Userssourcereposcsom-core-testProgram.cs:line 37
at CSOM_core_test.Program.<Main>(String[] args)
А ниже приведены мои коды:
using System.Runtime.InteropServices.ComTypes;
using System.Security.Cryptography;
using System.Net;
using System;
using Microsoft.SharePoint.Client;
using System.Web;
using System.Security;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace CSOM_core_test
{
class Program
{
static async Task Main(string[] args)
{
string tokenEndpoint = "https://login.microsoftonline.com/common/oauth2/token";
string resource = "removed";
var clientId = "clientid";
var username = "O365 email";
var httpClient = new HttpClient();
string token = "";
var pwd = new System.Net.NetworkCredential(string.Empty, GetPwd()).Password;
var body = $"resource={resource}amp;client_id={clientId}amp;grant_type=passwordamp;username={HttpUtility.UrlEncode(username)}amp;password={HttpUtility.UrlEncode(pwd)}";
using (var stringContent = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"))
{
var result = await httpClient.PostAsync(tokenEndpoint, stringContent).ContinueWith((response) =>
{
return response.Result.Content.ReadAsStringAsync().Resu<
});
var tokenResult = JsonSerializer.Deserialize<JsonElement>(result);
token = tokenResult.GetProperty("access_token").GetString();
}
var ctx = new ClientContext(new Uri("https://test.sharepoint.com/"));
ctx.ExecutingWebRequest = (sender, e) =>
{
e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " token;
};
ctx.Load(ctx.Web);
ctx.ExecuteQuery();
Console.WriteLine(ctx.Web.Title);
}
static SecureString GetPwd()
{
var pwd = new SecureString();
foreach (var c in "password")
pwd.AppendChar(c);
return pwd;
}
}
}
Результат выглядит следующим образом:
Result: {
"error":"invalid_grant","error_description":"AADSTS50126: Error validating credentials due to invalid username or password.rnTrace ID: cc136100-1351-4344-8901-0fd3fc022e00rnCorrelation ID: 4e0cc404-643e-47d3-a06d-0c52bcd77e22rnTimestamp: 2021-08-20 22:10:12Z","error_codes":[50126],"timestamp":"2021-08-20 22:10:12Z","trace_id":"cc136100-1351-4344-8901-0fd3fc022e00","correlation_id":"4e0cc404-643e-47d3-a06d-0c52bcd77e22","error_uri":"https://login.microsoftonline.com/error?code=50126"}
Комментарии:
1. Не могли бы вы, пожалуйста, показать пример json, который вы пытаетесь проанализировать?
2. Я не пытаюсь анализировать json. Я беру эту статью в качестве ссылки. helgesmeby.net/2020/06/25/…
3. @QihongKuang Вы анализируете Json здесь
var tokenResult = JsonSerializer.Deserialize<JsonElement>(result);
. Возможно, вы захотите добавить то, что есть вresult
вашем вопросе. Это будут данные JSON.4. @Eric J. Ты прав. Результат выглядит так. Это как показано ниже: Результат: { «ошибка»:»недействительный_грант»,»ошибка описания»:»AADSTS50126: Ошибка проверки учетных данных из-за неверного имени пользователя или пароля. на RnTrace идентификатор: cc136100-1351-4344-8901-0fd3fc022e00РnCorrelation идентификатор: 4e0cc404-643e-47d3-a06d-0c52bcd77e22 наRnTimestamp: 2021-08-20 22:10:12Z с»,»error_codes»:[50126],»метка времени»:»2021-08-20 22:10:12Z»,»trace_id»:»cc136100-1351-4344-8901-0fd3fc022e00″,»correlation_id»:»4e0cc404-643e-47d3-a06d-0c52bcd77e22″,»error_uri»:» login.microsoftonline.com/error?code=50126 «}
5. Вот в чем твоя проблема. Вы пытаетесь получить
access_token
, но его нет в JSON. Сначала вы должны проверить, есть лиerror
они.