Исходная базовая аутентификация с помощью ASP.NET MVC

Кто-нибудь знает, как это работает, я использую поставщик членства .net и просто хочу вытащить список xml. Я также использую .net mvc sdk. Так вот проблема, когда я добавляю [WebApiEnabled] в верхней части моего контроллера, я могу успешно вытащить xml/json. Но когда я добавляю [Authenticate] в начало моего контроллера, я не могу войти в систему. В качестве примера curl -i -u "admin: pass" -H "Accept: application/xml" http://localhost:xxxx/Book

Заранее благодарим за помощь

Ответ 1

Хорошо, поэтому я понял это, но решение может быть немного гетто. Я взял AuthorizeAttribute из источника .net mvc и перекодировал метод OnAutorization. Это определенно работает для меня, но это просто работает для базовой проверки подлинности, и я не уверен, что это самый безопасный метод для использования. Однако он решает проблему, когда веб-клиенты могут получить доступ к защищенным службам .net mvc rest.

public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }


        string auth = filterContext.HttpContext.Request.Headers["authorization"];

        if (!String.IsNullOrEmpty(auth))
        {
            byte[] encodedDataAsBytes = Convert.FromBase64String(auth.Replace("Basic ", ""));
            string val = Encoding.ASCII.GetString(encodedDataAsBytes);
            string userpass = val;
            string user = userpass.Substring(0, userpass.IndexOf(':'));
            string pass = userpass.Substring(userpass.IndexOf(':') + 1);

            if (!System.Web.Security.Membership.Provider.ValidateUser(user, pass))
            {
                filterContext.Result = new HttpUnauthorizedResult();
            }

        }
        else
        {
            if (AuthorizeCore(filterContext.HttpContext))
            {


                HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
                cachePolicy.SetProxyMaxAge(new TimeSpan(0));
                cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
            }
            else
            {
                // auth failed, redirect to login page
                filterContext.Result = new HttpUnauthorizedResult();
            }
        }


    }

Ответ 2

Я думал, что добавлю это здесь для кого-либо (такого как я), который не в состоянии обернуть голову вокруг ответа, предоставленного автором здесь. Здесь сообщение в блоге, которое я просто описал, как выполнить это с помощью атрибута [CustomBasicAuthorize], который может использоваться так же, как атрибут [Authorize], который поставляется с MVC: http://cacheandquery.com/blog/2011/03/customizing-asp-net-mvc-basic-authentication/

Ответ 3

Вы можете использовать аутентификацию HTTP Digest Access (некоторые детали реализации здесь и здесь), который намного сильнее базового, но по-прежнему представляет собой компромисс в области безопасности. Если вам понадобится больше безопасности, установка службы за SSL (если это вариант) будет достаточно.