Pranya Jonnalagadla Ответов: 2

Asp.net основной веб-API basic авторизации


Привет, я новичок в asp.net основной и пытаюсь реализовать базовые авторизации, после этого док-узел MSDN
Базовая аутентификация в системе ASP.NET веб-API | Microsoft Docs[^]

Что я уже пробовал:

Я использую приведенный ниже код. Я получаю следующие ошибки

Ошибки:

1) не удалось найти тип или имя пространства имен 'IHttpModule'
2) использование универсального типа 'IHttpApplication<tcontext>' требует аргументов типа 1
3) 'IHeaderDictionary' не содержит определение для 'Набор', а не метод расширения 'набор', принимающий первый аргумент типа IHeaderDictionary '' может быть найден
4) 'HttpContext' не содержит определения для 'Current'
5) 'IHeaderDictionary' не содержит определения для 'Get' и лучшей перегрузки метода расширения 'SessionExtensions.Get(ISession, string)' требует приемника типа 'ISession'
6) Отсутствие перегрузки для метода 'StartsWith' принимает 2 аргумента
7) 'byte[]' не содержит определения для 'Substring' и не может быть найден метод расширения 'Substring', принимающий первый аргумент типа 'byte[]'
8) имя "_next" не существует в текущем контексте

namespace BasicAuth
{
        public class BasicAuthHttpModule : IHttpModule
        {
            private const string Realm = "My App Name";

            public void Init(IHttpApplication context)
            {
                // Register event handlers
                context.AuthenticateRequest += OnApplicationAuthenticateRequest;
                context.EndRequest += OnApplicationEndRequest;
            }

            private static void SetPrincipal(IPrincipal principal)
            {
                Thread.CurrentPrincipal = principal;
                if (HttpContext.Current != null)
                {
                    HttpContext.Current.User = principal;
                }
            }

            // TODO: Here is where you would validate the username and password.
            private static bool CheckPassword(string username, string password)
            {
                return username == "user" && password == "password";
            }

            private static void AuthenticateUser(string credentials)
            {
                try
                {
                    var encoding = Encoding.GetEncoding("iso-8859-1");
                    credentials = encoding.GetString(Convert.FromBase64String(credentials));

                    int separator = credentials.IndexOf(':');
                    string name = credentials.Substring(0, separator);
                    string password = credentials.Substring(separator + 1);

                    if (CheckPassword(name, password))
                    {
                        var identity = new GenericIdentity(name);
                        SetPrincipal(new GenericPrincipal(identity, null));
                    }
                    else
                    {
                        // Invalid username or password.
                        HttpContext.Current.Response.StatusCode = 401;
                    }
                }
                catch (FormatException)
                {
                    // Credentials were not formatted correctly.
                    HttpContext.Current.Response.StatusCode = 401;
                }
            }

            private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
            {
                var request = HttpContext.Current.Request;
                var authHeader = request.Headers["Authorization"];
                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)
                    {
                        AuthenticateUser(authHeaderVal.Parameter);
                    }
                }
            }

            // If the request was unauthorized, add the WWW-Authenticate header 
            // to the response.
            private static void OnApplicationEndRequest(object sender, EventArgs e)
            {
                var response = HttpContext.Current.Response;
                if (response.StatusCode == 401)
                {
                    response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", Realm));
                }
            }

            public void Dispose()
            {
            }

            public async Task Invoke(HttpContext context)
            {
                var authHeader = context.Request.Headers.Get("Authorization");
                if (authHeader != null && authHeader.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
                {
                    var token = authHeader.Substring("Basic ".Length).Trim();
                    System.Console.WriteLine(token);
                    var credentialstring = Encoding.UTF8.GetString(Convert.FromBase64String(token));
                    var credentials = credentialstring.Split(':');
                    if (credentials[0] == "admin" && credentials[1] == "admin")
                    {
                        var claims = new[] { new Claim("name", credentials[0]), new Claim(ClaimTypes.Role, "Admin") };
                        var identity = new ClaimsIdentity(claims, "Basic");
                        context.User = new ClaimsPrincipal(identity);
                    }
                }
                else
                {
                    context.Response.StatusCode = 401;
                    context.Response.Headers.Set("WWW-Authenticate", "Basic realm=\"dotnetthoughts.net\"");
                }
                await _next(context);
            }
        }
}


Заранее спасибо.

2 Ответов

Рейтинг:
2

Richard Deeming

Документация, которой вы следуете, предназначена для ASP.NET веб-API, нет ASP.NET ядро. Несмотря на сходные до смешного названия, они фактически представляют собой совершенно разные фреймворки.

Вы должны следовать инструкциям для ASP.NET вместо этого ядро:
Настройка проверки подлинности Windows в ASP.NET ядро | Microsoft Docs[^]


Рейтинг:
1

F-ES Sitecore

Вам нужно добавить соответствующие операторы "using" в верхней части страницы. Если вы щелкните правой кнопкой мыши на IHttpModule, вы должны увидеть меню "рефакторинг" в контекстном меню, и это даст вам возможность добавить соответствующее "использование". В противном случае, если вы используете resharper или что-то еще, что тоже может это сделать. При отсутствии этих параметров вы можете добавить использование самостоятельно, но для этого вам нужно просто знать, в каком пространстве имен находится класс. Если погуглить или поискать на MSDN вы найдете это.

Интерфейс IHttpModule (System.Web)[^]

"Пространство Имен: System.Web"

Поэтому вам нужно добавить

using System.Web;


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