我正在使用[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管理器添加计算机密钥,但同样的事情发生。
在system.web(web.config)中引用此机器密钥
IIS上的和身份验证模式如下
仍然无法正常工作。显然我在这里遗漏了一些东西。
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错误。
答案 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的人,那么请确保您使用相同的字符代码对用户名和密码进行编码,因为服务器将对其进行解码英寸