Web API基本身份验证授权筛选器和计算机密钥

时间:2015-01-04 20:45:42

标签: c# asp.net asp.net-web-api

我正在使用[WebAPI Basic Authentication Authorization Filter]授权用户使用我简单的网络API数据服务。

问题是:一切都在localhost上运行,但当我将我的服务发布到网络(http://www.mywebsite.com)时,客户端应用程序始终会获得“取消授权”响应。

当从localhost切换到web

时,这一行是我在客户端改变的
//client.BaseAddress = new Uri("http://localhost:11992/"); // on localhost work
  client.BaseAddress = new Uri("http://mywebsite.com/"); // returns 401 Unauthorized

尝试使用远程IIS管理器添加计算机密钥,但同样的事情发生。

enter image description here

在system.web(web.config)中引用此机器密钥 enter image description here

IIS上的

和身份验证模式如下

enter image description here

仍然无法正常工作。显然我在这里遗漏了一些东西。

UPDATE 我正在扩展基本身份验证。过滤器,我稍后应用于我的控制器操作(我从客户端访问的那个)

[MyBasicAuthenticationFilter]
public class DataController : RavenController { ... }

并在此自定义身份验证中。过滤器有硬编码的用户名并传递

public class MyBasicAuthenticationFilter : BasicAuthenticationFilter
{

    public MyBasicAuthenticationFilter()
    { }

    public MyBasicAuthenticationFilter(bool active)
        : base(active)
    { }


    protected override bool OnAuthorizeUser(string username, string password, HttpActionContext actionContext)
    {
        if (username == "myuser" && password == "mypass")
            return true;
        else
            return false;
    }
}

从客户端(wpf客户端)

client.BaseAddress = new Uri("http://mywebsite.com/");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
                string.Format("{0}:{1}", "myuser", "mypass"))));

我很困惑,因为相同的代码在localhost上工作正常但是当我发布代码并将此client.BaseAddress更改为我的实际网站url时,它返回401错误。

1 个答案:

答案 0 :(得分:1)

给定Rick Strahl's Web Log的BasicAuthenticationFilter类使用系统的默认编码从授权标头中提取用户凭据。根据{{​​1}}属性的MSDN documentation

  

不同的计算机可以使用不同的编码作为默认编码   默认编码甚至可以在一台计算机上更改。因此,   数据从一台计算机流式传输到另一台计算机甚至是在   同一台计算机上的不同时间可能会被错误地翻译。   此外,Default属性返回的编码使用   最合适的后备将不受支持的字符映射到字符   代码页支持。出于这两个原因,使用默认值   通常不建议使用编码。确保编码的字节   如果解码得当,你应该使用Unicode编码,例如   UTF8Encoding或UnicodeEncoding,带前导码。另一种选择是   使用更高级别的协议来确保使用相同的格式   编码和解码。

根据提供的信息,这是最有可能的代码行,它可能会根据您的代码部署到的服务器的配置提供不同的结果。

因此,我会考虑在Encoding.Default类的ParseAuthorizationHeader方法中替换以下行:

BasicAuthenticationFilter

使用以下代码:

authHeader = Encoding.Default.GetString(Convert.FromBase64String(authHeader));

iso-8859-1将为您提供与发送基本身份验证标头的所有客户端的最佳兼容性。有关在执行HTTP基本身份验证时使用的建议编码,请参阅以下StackOverflow问题:What encoding should I use for HTTP Basic Authentication?

或者,如果您是唯一一位将从您的WCF客户端调用API的人,那么请确保您使用相同的字符代码对用户名和密码进行编码,因为服务器将对其进行解码英寸