从 Headers 中提取 BasicAuth 用户名 (C# WebService)

Extract BasicAuth username from Headers (C# WebService)

正如标题所说,用户通过 SSL 使用基本身份验证登录并调用 WebService 方法,我想提取身份验证 headers 并在方法函数中使用用户名参数。有没有一种简单的方法可以内联(在方法本身内部)或作为单独项目中的 Class 方法来执行此操作?

.NET 4.5、IIS 7.5

谢谢

经过一番搜索,我发现了一些代码可以满足我的要求:

string authHeader = WebClient.Headers[HttpRequestHeader.Authorization];

    if (authHeader != null && authHeader.StartsWith("Basic"))
    {
        Encoding encoding = Encoding.GetEncoding("iso-8859-1");
        string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
        string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
        int seperatorIndex = usernamePassword.IndexOf(':');
        return usernamePassword.Substring(0, seperatorIndex);
    }

但是编译 Visual Studio 时出现以下错误:non-static 字段、方法或 属性 'System.Net.WebClient.Headers.get'.[= 需要 object 引用12=]

我知道一旦我可以填充 authHeader 字符串,其他一切都会按预期工作,但我正在努力获取实际的 header 值。

终于找到了适合我们的解决方案,希望没有人发现它有任何重大问题,但如果您发现了,请分享。

private string username
    {
        get{
            HttpContext ctx = HttpContext.Current;
            string authHeader = ctx.Request.Headers["Authorization"];
            Encoding encoding = Encoding.GetEncoding("iso-8859-1");
            string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
            string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
            int seperatorIndex = usernamePassword.IndexOf(':');
            return usernamePassword.Substring(0, seperatorIndex);
        }
    }

这似乎解决了我们的问题,我们不想将用户名单独发送到 headers,因为它允许某人更改用户名参数而不影响他们登录的帐户,这样他们登录的帐户就是我们用来创建链接的帐户,并且它有效。