#c# #nancy
#c# #нэнси
Вопрос:
Каков наилучший подход к защите модулей с любой формой авторизации токена в Nancy в том же проекте? Мне нужны оба типа безопасности, и я предпочитаю не создавать отдельные приложения: одно с представлениями, защищенными с помощью Form, и одно для API, возвращающего JSON с использованием Token .
Я новичок в nancy и только что перенес приложение MVC 5 на nancy. Пока я не оглядываюсь назад! :-). Нравится простой подход.
В любом случае, я хотел бы услышать ваши идеи.
Спасибо!
Ответ №1:
Если вы создаете одностраничное приложение с помощью Nancy и AngujarJS (например), вам нужно использовать только аутентификацию токена. (Я рекомендую это)
Вы можете включить оба метода в загрузчике с помощью этого кода (этот код предназначен для включения аутентификации форм и базовой аутентификации)
(Это работает, но, на мой взгляд, не является элегантным решением)
protected override void RequestStartup(TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines, NancyContext context)
{
base.RequestStartup(container, pipelines, context);
var credentials = ExtractCredentialsFromRequest(context);
if(credentials !=null)
context.CurrentUser = container.Resolve<IUserValidator>().Validate(credentials[0], credentials[1]);
}
private string[] ExtractCredentialsFromRequest(NancyContext context)
{
var authHeader = context.Request.Headers["Authorization"].SingleOrDefault();
if (authHeader == null)
return null;
var credentials = authHeader.Split(new[]{':'}, StringSplitOptions.RemoveEmptyEntries);
if (credentials.Length != 2)
return null;
return credentials;
}
Есть еще один вариант (я его никогда не использовал) — это пакет nuget для аутентификации hibryd для nancy
https://www.nuget.org/packages/Nancy .Аутентификация.HybridStatelessAuthorizationHeaderAndForms/
Ответ №2:
Спасибо. Вдохновленный вашим предложением, я придумал следующий код:
protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
{
base.RequestStartup(container, pipelines, context);
if (context.Request.Headers["Authorization"].SingleOrDefault() == null)
{
//no Authorization header found / request cannot be authenicated using token authentication. Enable Form authentication.
var formsAuthConfiguration = new FormsAuthenticationConfiguration()
{
RedirectUrl = "~/user/login",
UserMapper = container.Resolve<IUserMapper>()
};
FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
}
else
{
//Authorization header found. Enable Token authentication.
TokenAuthentication.Enable(pipelines, new TokenAuthenticationConfiguration(container.Resolve<ITokenizer>()));
}
}
Это работает 🙂
Комментарии:
1. Вся моя конфигурация аутентификации в настоящее время находится в ApplicationStartup. Вы настраиваете что-нибудь для аутентификации сейчас в ApplicationStartup или вы переместили все в RequestStartup?
2. Нет, ничего в appstartup 🙂
3. Один последний комментарий, который я только что понял (трудный путь): когда вы хотите запросить токен через вызов API (передавая имя пользователя и пароль через запрос), вместо использования FormsAuthentication (отправка формы), обязательно укажите в заголовке авторизации запроса API простое значение (например»Запрос токена»), чтобы убедиться, что nancy разрешает проверку подлинности токена. Если вы этого не сделаете, Нэнси ответит на вызов API с помощью FormAuthenication, возвращая все, что вы настроили для возврата при попытке входа в систему с помощью FormsAuthencation, испортив ваш обратный вызов на клиенте