Лучший способ объединить авторизацию.Формы и авторизация.Токен в том же проекте?

#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, испортив ваш обратный вызов на клиенте