0

Ich habe eine Funktion, um meine Web-API aufzurufen. Es funktioniert gut, wenn TestCallingRemotely auf [AllowAnonymous] festgelegt ist.Web-API-Autorisierung über HttpWebRequest

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(); 

Wie gebe ich die username und password zum HttpWebRequest für die Zulassung?

Ich muss meine Web-API von CLR-Integration aufrufen, die nur unterstützt System.Net.

Antwort

1

uses bearer token authentication infrastructure Start Vorlage des ABP.

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); 

// ... 

Get Token

Dieses eine rohe Art und Weise verwendet, indem an MSDN article das Token, inspiriert zu extrahieren.

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

Es hat funktioniert. Danke, Bruder! –

+0

Gern geschehen! – aaron

+0

Hallo Bruder, jetzt versuche ich auf die API von einer anderen Domäne zuzugreifen. Ich habe [diese Lösung] (https://github.com/aspnetboilerplate/aspnetboilerplate-samples/blob/master/SimpleTaskSystem/SimpleTaskSystem.WebSpaAngular/App_Start/SimpleTaskSystemWebModule.cs) verwendet, um CORS zu aktivieren, aber es hat nicht funktioniert –

1

Wenn der Server die Standardauthentifizierung verwendet, kann man den Header wie folgt hinzu:

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();