https://learn.microsoft.com/en-us/dotne ... bs=Android await request.httpcontext.authenticateasync (smech); < /code>: < /p>
Токен доступа в свойствах Authresult не является JWT (мне нужно декодировать его, чтобы создать новую утверждение для приложения Maui). Можно сделать то же самое, что и точка 1, учитывая, что он jwt) < /li>
< /ol>
У меня также есть проект веб -приложения, например, предложенную документацию, и это его конфигурация: < /p>
Код: Выделить всё
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddMicrosoftAccount(options =>
{
options.ClientId = "ClientId";
options.ClientSecret = "ClientSecret";
options.SaveTokens = true;
options.CallbackPath = "/mobileauth";
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("offline_access");
options.Scope.Add("https://graph.microsoft.com/User.Read");
});
< /code>
Это Authcontroller для инициализации потока аутентификации: < /p>
[Route("mobileauth")]
[ApiController]
public class AuthController : ControllerBase
{
const String CallbackScheme = "myapp";
[HttpGet("{scheme}")] // eg: Microsoft, Facebook, Apple, etc
public async Task Get([FromRoute] String scheme)
{
var auth = await Request.HttpContext.AuthenticateAsync(scheme);
var isAuthenticated = auth.Succeeded
|| auth?.Principal is not null
|| (auth?.Principal is not null && auth.Principal.Identities.Any(id => id.IsAuthenticated))
|| (auth?.Properties is not null && !String.IsNullOrEmpty(auth.Properties.GetTokenValue("access_token")));
if (!isAuthenticated)
{
await Request.HttpContext.ChallengeAsync(scheme);
}
else
{
var claims = auth?.Principal?.Claims ?? throw new InvalidOperationException("Claims are required");
var email = claims?.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.Email)?.Value;
var queryParams = new Dictionary
{
// This token is not JWT and there is not IdToken in Properties
{ "access_token", auth.Properties?.GetTokenValue("access_token") ?? throw new InvalidOperationException("Access token is required") },
{ "refresh_token", auth.Properties.GetTokenValue("refresh_token") ?? String.Empty },
{ "expires_in", (auth.Properties.ExpiresUtc?.ToUnixTimeSeconds() ?? -1).ToString() },
{ "email", email ?? throw new InvalidOperationException("Email is required") }
}
.Where(kvp => !String.IsNullOrEmpty(kvp.Value) && kvp.Value != "-1")
.Select(kvp => $"{WebUtility.UrlEncode(kvp.Key)}={kvp.Value}");
var query = String.Join("&", queryParams);
var url = $"{CallbackScheme}://#{query}";
Request.HttpContext.Response.Redirect(url);
}
}
}
< /code>
Так я использую WebAuthenticator из Maui: < /p>
var authResult = await WebAuthenticator.Default.AuthenticateAsync(
new Uri("https://10.0.2.2:7016/mobileauth/Microsoft"),
new Uri("myapp://"));
Как видите здесь версия токена доступа 2:
Подробнее здесь: https://stackoverflow.com/questions/796 ... sstoken-is