ASP.NET: как заставить внешнее приложение записать файл cookie аутентификации?C#

Место общения программистов C#
Ответить
Anonymous
 ASP.NET: как заставить внешнее приложение записать файл cookie аутентификации?

Сообщение Anonymous »

У меня есть приложение ASP.NET, которое я перевожу со старой системы членства на платформу Identity (с целью в конечном итоге перенести все это на .NET Core, но это долгий путь) off).
У меня также есть еще одно консольное приложение .NET Framework (на самом деле оно работает как служба Windows, но это ни здесь, ни там), которое в основном выполняет некоторую автономную обработку выполняемых им заданий. вне очереди в таблице базы данных и передает сигнал обратно в приложение ASP.NET через Signal R.
Иногда консольное приложение использует Selenium для визуализации чего-либо в приложении ASP.NET и создания снимка экрана. Иногда, когда это происходит, важно, чтобы экземпляр драйвера Chrome, работающий через Selenium, вошел в систему.
Теперь, поскольку консольное приложение не имеет пароля пользователя, оно не может войдите в систему через обычную функцию входа в API, для которой требуется имя пользователя и пароль. Итак, при использовании старой системы членства я просто попросил консоль записать файл cookie аутентификации, который соответствовал бы тому, который записывало приложение ASP.NET. Для этого необходимо было убедиться, что раздел system.web файла app.config консольного приложения соответствует файлу web.config приложения ASP.NET, то есть тот же машинный ключ и, самое главное, тот же режим совместимости (который долгое время сбивал меня с толку).
У меня было и ASP.NET, и консольное приложение, вызывающее этот общий код:

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

public static HttpCookie CreateAuthenticationTicket(IUserModel user, bool persist)
{
if (user == null)
{
throw new InvalidOperationException("Cannot write authentication cookie - no user");
}

string userData = Newtonsoft.Json.JsonConvert.SerializeObject(user);

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, user.Email, DateTime.Now, persist ? DateTime.Now.AddMonths(6) : DateTime.Now.AddHours(1), persist, userData);     // 1 Yr if "remember me", 1 hour if not.

string encrypted = FormsAuthentication.Encrypt(ticket);
HttpCookie c = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);

if (persist)
{
c.Expires = ticket.Expiration;
}

if (!string.IsNullOrEmpty(FormsAuthentication.CookieDomain))
{
c.Domain = FormsAuthentication.CookieDomain;
}

return c;
}
А затем в консольном приложении, прежде чем вызывать нужный мне метод Javascript через Selenium, я устанавливаю файл cookie в Selenium. Все сработало нормально.
Но я не уверен, как добиться того же при использовании Identity. Я не уверен, где записывается файл cookie и что он использует для кодирования. По сути, мне нужно иметь возможность писать файлы cookie, совместимые с удостоверениями, в консольном приложении.
В качестве альтернативы приложение ASP.NET также позволяет использовать токены Bearer, но у меня нет удачи в выяснении того, как заставить оба приложения записывать совместимые токены.
Это настройка на стороне ASP.NET:

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

public void ConfigureOAuth(IAppBuilder app, System.Web.Mvc.IDependencyResolver kernel)
{
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider(kernel.GetService()),
};

// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
var bearerOptions = new OAuthBearerAuthenticationOptions();
app.UseOAuthBearerAuthentication(bearerOptions);

app.CreatePerOwinContext((option, context) =>
{
return kernel.GetService();
});

app.CreatePerOwinContext((option, context) =>
{
return kernel.GetService ();
});

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = PathString.Empty,
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity(
TimeSpan.FromMinutes(30),
(manager, user) => manager.GenerateUserIdentityAsync(user),
(claim) => claim.GetUserId())
},
CookieDomain = FormsAuthentication.CookieDomain,
CookiePath = "/; sameSite=None; secure"
});
}
На стороне ASP.NET я могу сделать что-то вроде этого, чтобы вручную создать токен:

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

var token = oAuthOptions.AccessTokenFormat.Protect(ticket);
Где oAuthOptions — это тот же OAuthBearerAuthenticationOptions, который использовался при запуске (это просто новый OAuthBearerAuthenticationOptions). Если я попробую то же самое в консольном приложении, OAuthBearerAuthenticationOptions.AccessTokenFormat будет иметь значение null.
Очевидно, что где-то при создании и регистрации SimpleAuthorizationServerProvider он должен быть назначен, но я не знаю, где, и не знаю, как предоставить моему консольному приложению подходящий экземпляр. Или какие настройки приложения/машины используются для шифрования токена-носителя.
Любые предложения или другие подходы приветствуются.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ion-cookie
Ответить

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

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

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

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

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