我有一个 OData 接口,已实现基本身份验证。不知何故,基本身份验证被其类设置为默认值。当我在不带关键字“Basic”的情况下在请求标头中传递凭据时,它工作正常,但当我这样做时,我收到 HTTP 500 内部服务器错误。 如何删除默认的基本身份验证设置?
这是我的授权类:
public class HttpBasicAuthorizeAttribute:AuthorizeAttribute {
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) {
Debug.WriteLine(actionContext.Request.Headers);
if (actionContext.Request.Headers.Authorization != null) {
// get the Authorization header value from the request and base64 decode it
string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.ToString()));
// custom authentication logic
if (string.Equals(userInfo,string.Format("{0}:{1}","name","=password"))) {
IsAuthorized(actionContext);
}
else {
HandleUnauthorizedRequest(actionContext);
}
}
else {
HandleUnauthorizedRequest(actionContext);
}
}
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) {
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) {
ReasonPhrase = "Unauthorized"
};
}
}
}
传递授权标头值的正确方法是“Basic {base64string}”,并且根据您在问题中共享的图像,正确的方法会导致您出现内部服务器错误。 这是因为
actionContext.Request.Headers.Authorization.ToString()
的输出不是有效的 Base64 字符串,因为它包含“Basic”字符串文字。在对其应用 Convert.FromBase64String()
之前,您需要从中删除“Basic”文字。
在
.Replace("Basic ", string.Empty)
末尾添加一个额外的 ToString()
就可以了。应该看起来像这样-
string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.ToString().Replace("Basic ", string.Empty)));