簡體   English   中英

使用HttpWebRequest的WEB API C#中的基本授權

[英]Basic authorization in WEB API C# using HttpWebRequest

我已經使用httpweb請求查找了有關Web api中基本授權的所有問題,但沒有一個問題解決了我的問題。 我有一個Web API(用C#編寫),我想為該API建立基本授權。 我還有一個用來調用api的網頁。 但是,它一直返回“(401)Unauthorized”,我不知道自己在做什么錯。 現在,我在代碼中使用了用戶名和密碼,但我希望彈出一個窗口以要求提供憑據。

這是我的網頁的代碼,調用api:

string url = String.Format("http://example.com");
HttpWebRequest requestObj = (HttpWebRequest)WebRequest.Create(url);
requestObj.Method = "Get";
requestObj.Credentials = new NetworkCredential("testing", "123456");

HttpWebResponse responseObj = null;
responseObj = (HttpWebResponse)requestObj.GetResponse();
string strresult = null;
using (Stream stream = responseObj.GetResponseStream())
{
    StreamReader sr = new StreamReader(stream);
    strresult = sr.ReadToEnd();
    sr.Close();
}

在我的api中,我打開了一個名為BasicAuthenticationAttribute的類,並編寫了以下代碼:

public class BasicAuthenticationAttribute : AuthorizationFilterAttribute
{
    public static bool IsAuthorizedUser(string Username, string Password)
    {
        return Username == "testing" && Password == "123456";
    }
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);
        if (actionContext.Request.Headers.Authorization != null)
        {
            var authToken = actionContext.Request.Headers.Authorization.Parameter;
            var decodeauthToken = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(authToken));
            var arrUserNameandPassword = decodeauthToken.Split(':');
            if (IsAuthorizedUser(arrUserNameandPassword[0], arrUserNameandPassword[1]))
            {
                Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(arrUserNameandPassword[0]), null);
            }
            else
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
            }
        }
        else
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        }
    }
}

在我的控制器中,我有這個:

 [BasicAuthentication]
 public class EventsController : ApiController
 {
 }

這是我收到的錯誤:遠程服務器返回錯誤:(401)未經授權。

嘗試使用授權類型將憑據添加到憑據緩存中,而不是直接使用緩存來使用憑據。

    string url = String.Format("http://example.com");
    CredentialCache credentialCache = new CredentialCache();
    credentialCache.Add(new Uri(url), "Basic", new NetworkCredential("testing", "123456"));
    HttpWebRequest requestObj = (HttpWebRequest)WebRequest.Create(url);
    requestObj.PreAuthenticate = true;
    requestObj.Method = "Get";
    requestObj.Credentials = **credentialCache**;
    HttpWebResponse responseObj = null;
    responseObj = (HttpWebResponse)requestObj.GetResponse();
    string strresult = null;
    using (Stream stream = responseObj.GetResponseStream())
    {
        StreamReader sr = new StreamReader(stream);
        strresult = sr.ReadToEnd();
        sr.Close();
    }

如以上消息中所述,我認為問題是因為您沒有從身份驗證標頭中刪除“基本”。 https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/security/basic-authentication

我該怎么辦...

string authToken = actionContext.Request.Headers.Authorization.Parameter;
authToken = authToken.Replace("Basic", string.Empty);
var decodeauthToken = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(authToken));

拆分時嘗試此操作。 關於您的實現中唯一的一件事情與我多次所做的不同。

var arrUserNameandPassword = decodeauthToken.Split(':'c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM