gpt4 book ai didi

c# - MVC 中的 OAuth 2.0 Mailkit "Authentication failed",但 C# 控制台应用程序工作正常

转载 作者:行者123 更新时间:2023-12-03 02:22:01 24 4
gpt4 key购买 nike

因为Microsoft ends the support for Basic Authentication access for IMAP in Office 365我尝试更新我们的应用程序以使用 OAuth 2.0。我们在 MVC .Net Web 应用程序中使用 MailKit 来访问 IMAP 邮箱,但我收到一条错误消息,指出身份验证失败。不过,作为测试,我可以让它在 C# 控制台应用程序中工作。

奇怪的是:

  1. 如果我复制使用控制台应用程序获取的访问 token 并在我的 Web 应用程序中使用它,我可以成功地进行身份验证和阅读电子邮件。所以这部分有效。
  2. 身份验证本身在网络应用程序中似乎是成功的。我们的 Web 应用程序重定向到 Microsoft 登录页面,MFA 正常工作,我在 Azure A/D 中看到成功审核,并且我确实在回调中获得了一个 token 。但是,此 token 会通过 Mailkit 给出身份验证失败错误。
  3. 在 Azure A/D 中,我在成功审核之间看到了其中一些错误,但我不确定它们是否相关:错误 AADSTS16000 SelectUserAccount - 这是 Azure AD 引发的中断,这会导致允许用户从多个有效 SSO session 中进行选择的 UI。此错误相当常见,如果指定prompt=none,则可能会返回到应用程序。

我已经验证了我获取 token 的范围对于控制台和 Web 来说是相同的。

主要区别在于,我在控制台应用程序中使用 pca.AcquireTokenInteractive(scopes) 来获取 token ,但我在 MVC Controller 中使用带有回调的 Webclient 调用。

这是我的代码(MVC):

public ActionResult Index()
{
string clientID = "[client-id here]";
string clientSecret = "[client-secret here]";
string redirectUri = "[redirectUri here]";

AuthorizationServerDescription server = new AuthorizationServerDescription
{
AuthorizationEndpoint = new Uri("https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize"),
TokenEndpoint = new Uri("https://login.microsoftonline.com/organizations/oauth2/v2.0/token"),
ProtocolVersion = ProtocolVersion.V20,
};

List<string> scopes = new List<string>
{
"email",
"offline_access",
"https://outlook.office365.com/IMAP.AccessAsUser.All"
};

WebServerClient consumer = new WebServerClient(server, clientID, clientSecret);

OutgoingWebResponse response = consumer.PrepareRequestUserAuthorization(
scopes, new Uri(redirectUri));

return response.AsActionResultMvc5();
}

public async Task<ActionResult> Authorized(string code, string state, string session_state)
{
List<string> scopes = new List<string>
{
"IMAP.AccessAsUser.All",
"User.Read",
"offline_access"
};

HttpClient httpClient = new HttpClient();

var values = new Dictionary<string, string>
{
{ "Host", "https://login.microsoftonline.com" },
{ "Content-Type", "application/x-www-form-urlencoded" },
{ "client_id", "[client-id here]" },
{ "scope", string.Join(" ",scopes) },
{ "code", code },
{ "redirect_uri", [redirectUri here] },
{ "grant_type", "authorization_code" },
{ "client_secret", "[client-secret here]" },
{ "state", state },
};

var content = new FormUrlEncodedContent(values);

var response = await httpClient.PostAsync("https://login.microsoftonline.com/organizations/oauth2/v2.0/token", content);


var jsonString = await response.Content.ReadAsStringAsync();
var oathToken = JsonConvert.DeserializeObject<OathToken>(jsonString);

var oauth2 = new SaslMechanismOAuth2("[Email here]", oathToken.access_token);
var stringBuilder = new StringBuilder();

using (var client = new ImapClient())
{
try
{
await client.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.Auto);
await client.AuthenticateAsync(oauth2);

var inbox = client.Inbox;
inbox.Open(FolderAccess.ReadOnly);

for (int i = 0; i < inbox.Count; i++)
{
var message = inbox.GetMessage(i);
stringBuilder.AppendLine($"Subject: {message.Subject}");
}

await client.DisconnectAsync(true);

return Content(stringBuilder.ToString());

}
catch (Exception e)
{
return Content(e.Message);
}

}
}

该行发生身份验证失败错误等待 client.AuthenticateAsync(oauth2);

最佳答案

问题在于范围“电子邮件”。我们必须删除它。到底为什么,我不知道。在控制台应用程序中使用时没有问题。也许这与我们在其中使用 pca.AcquireTokenInteractive(scopes) 有关。

关于c# - MVC 中的 OAuth 2.0 Mailkit "Authentication failed",但 C# 控制台应用程序工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68501252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com