Успокоительная стандартная аутентификация с ASP.NET MVC

Поскольку это - MemoryStream, Вы действительно не делаете потребность для закрытия потока - ничего плохо не произойдет, если Вы не сделаете, хотя, очевидно, это - хорошая практика для расположения чего-либо, что это доступно так или иначе. (См. этот вопрос для больше на этом.)

Однако Вы должны расположить Битовый массив - и это закроет поток для Вас. В основном, как только Вы даете Растровому конструктору поток, он "владеет" потоком, и Вы не должны закрывать его. Как говорится в документах для того конструктора :

необходимо сохранить поток открытым в течение времени жизни Битового массива.

я не могу найти документы, обещающие закрыть поток, когда Вы располагаете битовый массив, но необходимо быть в состоянии проверить это довольно легко.

14
задан 10 September 2009 в 19:11
поделиться

3 ответа

How to use REST with basic authentication is covered in the answers to this stackoverflow question:

Basic Authentication with WCF REST service to something other than windows accounts?

0
ответ дан 1 December 2019 в 13:21
поделиться

Хорошо, я разобрался, но решением может быть немного гетто. Я взял 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();
            }
        }


    }
8
ответ дан 1 December 2019 в 13:21
поделиться

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

2
ответ дан 1 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: