Нужен код в VB для проверки заголовка с зашифрованным ключом для каждого запроса и метода веб-службы через веб-службу asmx. Например: реализовав IHttpModule для класса с асинхронными событиями BeginRequest, я попытался реализовать его неработающим.
Любые подобные примеры будут рекомендованы в asp.net VB и фреймворке 4.6.1.
- следующий код для асинхронного запроса на начало не работает в 4.6 фреймворке
public class BasicAuthHttpModule : IHttpModule
{
const String AUTH_USER_PREFIX= "auth.user.";
static readonly IDictionary<String, String> logins = ConfigurationManager.AppSettings.AllKeys.Where(k => k.StartsWith(AUTH_USER_PREFIX))
.ToDictionary(key => key.Replace(AUTH_USER_PREFIX, String.Empty), value => ConfigurationManager.AppSettings.Get(value));
public void Init(HttpApplication context)
{
context.AuthenticateRequest += OnAuthenticateRequest;
context.EndRequest += OnEndRequest;
}
private static void OnAuthenticateRequest(object sender, EventArgs e)
{
var authHeaders = HttpContext.Current.Request.Headers["Authorization"];
if (authHeaders != null)
{
var authHeadersValue = AuthenticationHeaderValue.Parse(authHeaders);
if (authHeadersValue.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) && !String.IsNullOrWhiteSpace(authHeadersValue.Parameter))
{
try
{
var credentials = authHeadersValue.Parameter;
var encoding = Encoding.GetEncoding("iso-8859-1");
credentials = encoding.GetString(Convert.FromBase64String(credentials));
string name = credentials.Split(':').First();
string password = credentials.Split(':').Last();
if (logins.Any(l => l.Key.Equals(name) && l.Value.Equals(password)))
{
//Set the principal for validated user
var principal = new GenericPrincipal(new GenericIdentity(name), null);
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
}
else
{
//Authentication failed
HttpContext.Current.Response.StatusCode = 401;
}
}
catch (FormatException)
{
HttpContext.Current.Response.StatusCode = 401;
}
}
}
}