Аутентификация основного приложения Vue.js и ASP.NETC#

Место общения программистов C#
Ответить
Anonymous
 Аутентификация основного приложения Vue.js и ASP.NET

Сообщение Anonymous »

У меня есть система, состоящая из клиентского приложения Vue.js и серверной части ASP.NET Core 9. Этот серверный процесс использует app.MapFallbackToFile("/index.html").RequireAuthorization(); для обслуживания клиентского приложения только авторизованным пользователям. Мне нужно позвонить из третьего приложения, используя аутентификацию LTI. Они отправляют мне токен JWT только в первый раз, который я могу аутентифицировать с помощью:

Код: Выделить всё

// In building I use
.AddJwtBearer(async opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = jwtSection.Issuer,
ValidateAudience = true,
ValidAudience = jwtSection.Audience,
ValidateLifetime = true,
IssuerSigningKeys = keys
};

opt.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
if (context.Request.ContentType == "application/x-www-form-urlencoded")
{
if (context.Request.Form.Any(f => f.Key == jwtSection.TokenField))
{
var token = context.Request.Form[jwtSection.TokenField];

// Set jwt cookie
context.Response.Cookies.Append("jwt", token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.None
});
context.Token = token;
}
}

if (context.Request.Cookies.TryGetValue("token", out var jwt))
{
context.Token = jwt;
}

return Task.CompletedTask;
}
};
});

// In startup I use this
app.UseCookiePolicy(new CookiePolicyOptions
{
HttpOnly = Microsoft.AspNetCore.CookiePolicy.HttpOnlyPolicy.Always,
Secure = CookieSecurePolicy.SameAsRequest,
MinimumSameSitePolicy = SameSiteMode.None,
});

app.MapGet("vue/api/me", (HttpContext context) =>
{
return new { name = context.User.Claims.FirstOrDefault(f => f.Type == "name") };
}).RequireAuthorization();

app.MapFallbackToFile("/index.html").RequireAuthorization();
Но когда я пытаюсь установить файл cookie в ответ, я не вижу ни его, ни других файлов cookie из моего основного сервера asp.net в клиентском приложении внутри iframe по адресу https://. saltire.lti.app/platform:

Код: Выделить всё

about:blank

Если я загружаю свое приложение на новой вкладке вместо iframe, я вижу много файлов cookie из моего серверного интерфейса, но не файл cookie JWT.
Вызов /me также не авторизован.
Есть идеи, как сохранить токен JWT в клиентском приложении и использовать его для будущей аутентификации? Нет необходимости использовать ответный файл cookie, мне нужно аутентифицировать свое приложение Vue.js, чего бы это ни стоило...
В потоке LTI они вызывают мой бэкэнд в этом действии:< /p>

Код: Выделить всё

[HttpPost("launch")]
[Authorize]
[Consumes("application/x-www-form-urlencoded")]
public async Task PostLaunch([FromForm] JwtPayload request)
{
await Task.CompletedTask;

if (HttpContext.User.Identity?.IsAuthenticated == true)
{
return this.RedirectPreserveMethod("/");
}
}
Это последнее разрешенное действие (именно здесь я получаю токен JWT от lti). Эта инструкция this.RedirectPreserveMethod("/"); позволяет мне вернуть вызывающему объекту приложение Vue.js.
Редактирование 1: я начинаю свое путешествие в saltire.lti. app, я туннелирую свою локальную машину с помощью ngrok, поэтому общедоступный URL-адрес https://15e1-93-41-196-8.ngrok-free.app, ngrok вперед трафик к моему серверу dotnet обслуживается по адресу https://localhost:7093, но мое приложение vue.js обслуживается по адресу https://localhost:64928. В консоли браузера я вижу три разных домена, и консоль отвечает мне на эту ошибку: Файл cookie «jwt» отклонен для недопустимого домена. Я получаю этот заголовок: jwt=...; домен = https://15e1-93-41-196-8.ngrok-free.app; путь =/; безопасный; тот же сайт = нет; httponly.
Изображение

Я создал файл cookie с помощью этого кода:

Код: Выделить всё

HttpContext.Response.Cookies.Append("jwt", written, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.None,
Domain = "https://15e1-93-41-196-8.ngrok-free.app"
});
Даже используя localhost в качестве домена, это не работает, ошибка в консоли браузера.


Подробнее здесь: https://stackoverflow.com/questions/793 ... entication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»