Подтвердить что ты не робот

Обычная проверка подлинности в web api

Я начал работать над Web Api и просто хочу создать простую базовую аутентификацию. Я хочу знать, как это сделать?

Я пробовал с данной ссылкой MSDN, но в MSDN не указана мудрая методика. http://www.asp.net/web-api/overview/security/basic-authentication

4b9b3361

Ответ 1

Ссылка, которую вы дали, содержит большую часть необходимой вам информации, я надеюсь, что это заполняет пробелы.

Примечание.. При использовании Web.API 2 Microsoft предлагает другой подход с использованием фильтров проверки подлинности.

Настройте https на вашем сервере

Это очень важно, если вам нужна реальная безопасность, иначе пароли могут быть почерпнуты участниками отслеживания. Как вы это делаете, это зависит полностью от вашей настройки, которую вы не детализировали, но если вы работаете над Azure WebRole, там довольно хороший шаг за шагом руководство по настройке SSL из Microsoft.

Это не обязательно для следующих шагов, но это необходимо сделать, прежде чем вы отпустите свой код. Я упоминаю об этом сначала, потому что эта часть обычно связана с привлечением других людей (sysadmin для конфигурации сервера, финансов для приобретения сертификата и т.д.), И это хорошо, чтобы дать им много предупреждений.

Записать (или украсть) пользовательский IHttpModule для выполнения вашей аутентификации

Это большой блок кода С# в вашей ссылке - он анализирует значения, отправленные браузером, и устанавливает HttpContext.Current.User на аутентифицированный пользователь. Просто скопируйте и вставьте мясо в класс в свое приложение и хорошо вернетесь к нему позже. В вашем коде вам понадобятся следующие операторы.

using System; using System.Net.Http.Headers; using System.Security.Principal;
using System.Text; using System.Threading; using System.Web;

Свяжите этот модуль с вашим приложением

Добавить новый модуль в ваш файл web.config(возможно, уже существует файл note.webServer)

<system.webServer>
  <modules>
    <add name="BasicAuth" type="Full.ClassName.Path.BasicAuth, Assembly.Name"/>
  </modules>
</system.webServer>

Ограничить доступ к соответствующим частям вашего сайта

Вы можете заблокировать определенные действия, добавив атрибут [Авторизовать] до определения действия. Блокируйте весь контроллер, добавив его перед классом контроллера.

[Authorize] // Restricts access to whole controller    
public class StockController : ApiController {
    [Authorize] // Restricts access to this action - not necessary if whole controller restricted.
    public IEnumerable<StockLevel> Get() {

Или в вашем файле App_Start\WebApiConfig.cs вы можете добавить config.Filters.Add(new AuthorizeAttribute());, и он заблокирует все.

Что-то, на что нужно обратить внимание - theres также System.Web.Mvc.AuthorizeAttribute, поэтому, если у вас есть это пространство имен, вы можете получить запутанные результаты.

На этом этапе вы можете попробовать - пользователь: "пользователь", передать: "пароль".

Настройте проверку пользователя

Вернитесь к классу, который мы украли из ссылки, и вы увидите следующий блок кода:

// TODO: Here is where you would validate the username and password.
private static bool CheckPassword(string username, string password)

Отмените это, чтобы вернуть true, если имя пользователя и пароль действительны. Если вы катаетесь самостоятельно, вы можете изучить bcrypt (доверяете ли вы реализации, которую вы загрузили из сети?), PBKDF2 или класс Crypto (простой, но не очень безопасный), но там вероятно, что-то лучше от Microsoft, так как существует множество проблем с сохранением паролей.

Ответ 2

Мне пришлось добавить несколько строк кода в пример MSDN, чтобы заставить его работать. В частности, в OnApplicationAuthenticateRequest() я установил код состояния ответа 401, если пользователь не может быть проверен:

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var request = HttpContext.Current.Request;
            var authHeader = request.Headers["Authorization"];
            bool validated = false;
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                                                StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                {
                    validated = AuthenticateUser(authHeaderVal.Parameter);
                }
            }

            if (!validated)
            {
                HttpContext.Current.Response.StatusCode = 401;
            }
        }

Как только я это сделал, он работал нормально. Там, вероятно, лучшие способы структурирования логики, но это касается наименьшего изменения из примера, выполняющего задание.

Ответ 3

Чтобы выборочно включить базовую аутентификацию для каждого контроллера или для каждого метода, вы можете получить от AuthorizeAttribute, как описано в этом вопросе.