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); } } }
Заранее спасибо.