Обычная базовая аутентификация с ASP.NET MVC - PullRequest
14 голосов
/ 10 сентября 2009

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

Заранее спасибо за помощь

Ответы [ 4 ]

9 голосов
/ 01 марта 2011

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

8 голосов
/ 11 сентября 2009

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

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 голосов
/ 13 января 2010

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

0 голосов
/ 11 сентября 2009

Как использовать REST с базовой аутентификацией, описано в ответах на этот вопрос stackoverflow:

Базовая аутентификация с помощью службы WCF REST для чего-либо, кроме учетных записей Windows?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...