标头中的 HTTP 授权默认是基本的,如果提及则抛出 http500

问题描述 投票:0回答:1

我有一个 OData 接口,已实现基本身份验证。不知何故,基本身份验证被其类设置为默认值。当我在不带关键字“Basic”的情况下在请求标头中传递凭据时,它工作正常,但当我这样做时,我收到 HTTP 500 内部服务器错误。 如何删除默认的基本身份验证设置?

作品: enter image description here

不起作用,就像它应该的那样: enter image description here

这是我的授权类:

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

}

c# asp.net odata basic-authentication
1个回答
0
投票

传递授权标头值的正确方法是“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)));
        
© www.soinside.com 2019 - 2024. All rights reserved.