3

我已经审查了很多问题,但尚未解决问题。对于身份验证,包括Microsoft.AspNetCore.Authentication.MicrosoftAccount。身份验证和授权运行良好。除了令牌刷新之外,该库会自动执行所有操作,这似乎很尴尬。

对于令牌刷新,offline_access包括:

app.UseMicrosoftAccountAuthentication(new MicrosoftAccountOptions
{
    ClientId = Startup.Config["Data:MSAppId"],
    ClientSecret = Startup.Config["Data:MSAppSecret"],
    CallbackPath = new PathString("/signin-microsoft-token"),
    AuthorizationEndpoint = MicrosoftAccountDefaults.AuthorizationEndpoint,
    SignInScheme = new IdentityCookieOptions().ExternalCookieAuthenticationScheme,
    TokenEndpoint = MicrosoftAccountDefaults.TokenEndpoint,
    Scope = { "openid", "email", "profile", "offline_access", "Contacts.Read", "Mail.ReadWrite", "Mail.Send" },
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    SaveTokens = true
});

令牌保存在AspNetUserTokens表中。
AspNetUserTokens 表

使用访问令牌,成功返回联系人和电子邮件,并代表用户成功发送电子邮件。但是,当尝试使用刷新令牌时,会返回“错误请求” [400] 错误。

string clientId = /* ... */
string clientSecret = /* ... */
string access_token = /* ... */
string refresh_token = /* ... */
DateTime expiration_date = /* ... */

const string refreshTokenUrl = "https://login.microsoftonline.com/common/oauth2/token";
const string redirectUri = "http://localhost/";

if (DateTime.Now < (expiration_date - TimeSpan.FromMinutes(10)))
    return access_token;

HttpClient client = new HttpClient();
string parameters = $"grant_type=refresh_token&refresh_token={ WebUtility.UrlEncode(refresh_token) }&client_id={ WebUtility.UrlEncode(clientId) }&client_secret={ WebUtility.UrlEncode(clientSecret) }&redirect_uri={ WebUtility.UrlEncode(redirectUri) }";
var contentBody = new StringContent(parameters, System.Text.Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage response = await client.PostAsync(refreshTokenUrl, contentBody);
if (!response.IsSuccessStatusCode)
{
    // process 400 - bad request error ...
}

我用 fiddler 查看了请求,它看起来是正确的。我已经在纯 REST 解决方案中使用了上面类似的代码,并且没有遇到任何困难。

我原以为他们的库会有更好的解决方案来刷新令牌,因为它可以毫不费力地用于原始身份验证和授权。有没有更好的方法来解决这个问题?如果不是,为什么请求被拒绝?

编辑:

删除redirect_uri导致相同的错误响应。用 fiddler 深入观察,错误响应 (JSON) 的正文以以下内容开头:

{
  "error":"invalid_grant",
  "error_description":"AADSTS70000: Transmission data parser failure: Refresh Token is malformed or invalid.
  Trace ID: 92beaa67-97f9-48c3-8281-87da228b0000
  // next is Correlation ID, Timestamp, trace_id, etc

但是我确信整个 refresh_token 已正确保存和发送,最后一次测试有 953 个字符。

4

0 回答 0