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

时间:2015-07-07 10:17:12

标签: c# web-services authentication iis-7.5

就像标题所说的那样,用户使用基本身份验证通过SSL登录并调用WebService方法,我想提取auth标头并在方法函数中使用username参数。是否有一种简单的方法可以内联(在Method本身内),或作为单独项目中的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错误时:非静态字段,方法或属性需要对象引用&System; Net.Net.WebClient.Headers.get'。

我知道一旦我可以填充authHeader字符串,其他一切都会按预期工作,但我很难获得实际的标头值。

1 个答案:

答案 0 :(得分:0)

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

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);
        }
    }

这似乎解决了我们的问题,我们并不想将用户名分别发送到标题,因为它会允许某人更改用户名参数而不影响他们登录的帐户,这样帐户他们登录的是我们用来创建链接的帐户,它可以运行。