[英]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.