2015-11-05 190 views
0

我有,我想其他.NET应用程序使Web请求发送到Web API服务,但是我发现了以下错误这样做时:的Web请求的.NET Web API服务得到401未经授权错误

”远程服务器返回错误:(401)未经授权。“

只是为了澄清,这些是2个独立的.net应用程序试图沟通。

下面是客户端的.Net C#应用程序试图使Web请求到其他Web API服务的代码:

public string MakeWebRequest() 
    { 
     var requestUrl = "http://localhost:8081/api/Tests/results"; 

     var request = WebRequest.Create(requestUrl); 
     var username = "test"; 
     var password = "test"; 
     SetBasicAuthHeader(request, username, password); 

     var postData = "thing1=hello"; 
     postData += "&thing2=world"; 
     var data = Encoding.ASCII.GetBytes(postData); 

     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     request.ContentLength = data.Length; 
     //request.Expect = "application/json"; 

     using (var stream = request.GetRequestStream()) 
     { 
      stream.Write(data, 0, data.Length); 
     } 

     string text; 
     var response = (HttpWebResponse)request.GetResponse(); 

     using (var sr = new StreamReader(response.GetResponseStream())) 
     { 
      text = sr.ReadToEnd(); 
     } 

     return null; 
    } 

    public static void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers["Authorization"] = "Basic " + authInfo; 
    } 

而这里的净C#的Web API服务的代码时,应该接收从其他应用程序的网络请求:

[RoutePrefix("api/Tests")] 
public class TestsApiController : ApiController 
{ 
    [POST("results")] 
    [AcceptVerbs("POST")] 
    [HttpPost] 
    [BasicAuthAuthorize(Roles="Admin")] 
    public JObject resultsFinished() 
    { 
    //do something 
    } 
} 

而这里的基本认证的属性我创建的,它甚至不会从客户服务的打击。

public class BasicAuthAuthorizeAttribute : AuthorizeAttribute 
{ 
    private const string BasicAuthResponseHeader = "WWW-Authenticate"; 
    private const string BasicAuthResponseHeaderValue = "Basic"; 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     try 
     { 
      AuthenticationHeaderValue authValue = actionContext.Request.Headers.Authorization; 

      if (authValue != null && !String.IsNullOrWhiteSpace(authValue.Parameter) && authValue.Scheme == BasicAuthResponseHeaderValue) 
      { 
       var parsedCredentials = ParseAuthorizationHeader(authValue.Parameter); 

       if (parsedCredentials != null) 
       { 
        if (parsedCredentials.Username == IoC.Username && parsedCredentials.Password == IoC.Password) 
         return; 
       } 
      } 
     } 
     catch (Exception) 
     { 
      //actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
      actionContext.Response.Headers.Add(BasicAuthResponseHeader, BasicAuthResponseHeaderValue); 
      return; 

     } 
    } 

    private Credentials ParseAuthorizationHeader(string authHeader) 
    { 
     string[] credentials = Encoding.ASCII.GetString(Convert.FromBase64String(authHeader)).Split(new[] { ':' }); 

     if (credentials.Length != 2 || string.IsNullOrEmpty(credentials[0]) || string.IsNullOrEmpty(credentials[1])) 
      return null; 

     return new Credentials() { Username = credentials[0], Password = credentials[1], }; 
    } 
} 
//Client credential 
public class Credentials 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 
+1

是我还是你发送**通过HTTP原始明文密码* * –

+0

抱歉忘记包含更多编码密码的代码。上面的通知编辑。谢谢! – jre247

+0

Web服务中可以运行“HelloWorld”或“Test”方法吗?这可能是运行该服务的应用程序池的id的问题。 – Duston

回答

0

尝试使用诸如Fiddler一个工具来解决什么被发送到Web服务:?

http://www.telerik.com/fiddler

+0

我没有看到任何与客户端应用程序向服务器应用程序发出请求有关的小提琴手。 :( – jre247

+0

所有的提琴手将看到的是从服务器回来的401错误 – Duston

+0

@Duston由于某种原因提琴手没有显示任何与401.相关的任何想法? – jre247

相关问题