0

웹 API를 호출하는 기능이 있습니다. TestCallingRemotely[AllowAnonymous]으로 설정된 경우 제대로 작동합니다.HttpWebRequest를 통한 웹 API 권한 부여

var httpWebRequest = (HttpWebRequest)WebRequest.Create(
    "http://localhost/api/services/myApp/commonLookup/TestCallingRemotely"); 
httpWebRequest.ContentType = "application/json"; 
httpWebRequest.Method = "POST"; 

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { 
    string input = "{}"; 

    streamWriter.Write(input); 
    streamWriter.Flush(); 
    streamWriter.Close(); 
} 

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

어떻게 권한 부여를 위해 HttpWebRequestusernamepassword 통과합니까?

내 웹 API를 System.Net 만 지원하는 CLR 통합에서 호출해야합니다. 서버가 기본 인증을 사용하는 경우

답변

1

ABP의 시작 템플릿 uses bearer token authentication infrastructure을.

var token = GetToken(username, password); 

// var httpWebRequest = (HttpWebRequest)WebRequest.Create(
//  "http://localhost/api/services/myApp/commonLookup/TestCallingRemotely"); 
// httpWebRequest.ContentType = "application/json"; 
// httpWebRequest.Method = "POST"; 

httpWebRequest.Headers.Add("Authorization", "Bearer " + token); 

// ... 

이것은 an MSDN article에서 영감을 토큰을 추출하는 원유 방법을 사용

토큰을 가져옵니다.

private string GetToken(string username, string password, string tenancyName = null) 
{ 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(
     "http://localhost:6334/api/Account/Authenticate"); 
    httpWebRequest.ContentType = "application/json"; 
    httpWebRequest.Method = "POST"; 

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
    { 
     var input = "{\"usernameOrEmailAddress\":\"" + username + "\"," + 
        "\"password\":\"" + password + "\"}"; 

     if (tenancyName != null) 
     { 
      input = input.TrimEnd('}') + "," + 
        "\"tenancyName\":\"" + tenancyName + "\"}"; 
     } 

     streamWriter.Write(input); 
     streamWriter.Flush(); 
     streamWriter.Close(); 
    } 

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
    string response; 

    using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
    { 
     response = streamReader.ReadToEnd(); 
    } 

    // Crude way 
    var entries = response.TrimStart('{').TrimEnd('}').Replace("\"", String.Empty).Split(','); 

    foreach (var entry in entries) 
    { 
     if (entry.Split(':')[0] == "result") 
     { 
      return entry.Split(':')[1]; 
     } 
    } 

    return null; 
} 
+0

효과가있었습니다. 형제 님 감사합니다! –

+0

당신을 진심으로 환영합니다! – aaron

+0

안녕하세요, 이제 다른 도메인에서 API에 액세스하려고합니다. CORS를 사용할 수 있도록 [이 해결책] (https://github.com/aspnetboilerplate/aspnetboilerplate-samples/blob/master/SimpleTaskSystem/SimpleTaskSystem.WebSpaAngular/App_Start/SimpleTaskSystemWebModule.cs)을 사용했지만 작동하지 않았습니다. –

1

는이 같은 헤더를 추가 할 수 있습니다

var httpWebRequest = (HttpWebRequest) WebRequest.Create(
"http://localhost/api/services/myApp/commonLookup/TestCallingRemotely"); 
httpWebRequest.ContentType = "application/json"; 
httpWebRequest.Method = "POST"; 

var username = "Aladdin"; 
var password = "opensesame"; 

var bytes = Encoding.UTF8.GetBytes($"{username}:{password}"); 
httpWebRequest.Headers.Add("Authorization", $"Basic {Convert.ToBase64String(bytes)}"); 

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
{ 
    string input = "{}"; 

    streamWriter.Write(input); 
    streamWriter.Flush(); 
    streamWriter.Close(); 
} 

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
관련 문제