2017-08-11 1 views
1

ich habe eine www.api.com und eine www.client.com alle registrierung erfolgt bei api.com und login erfolgt bei api.com. client.com kann nur die Benutzeroberfläche des Anmeldeformulars sehen.web-api-authentifizierung von client seite

nach Benutzeranmeldung und api.com geben ein Token an den Benutzer zurück. Wie verwende ich den Token, um auf den Rest des Webapi in der api.com zuzugreifen? Ich möchte auf die GetExployeeByID Methode zugreifen. nach der Verwendung anmelden. i das Token in dem Verfahren

api sessionStorage.setItem('token', data.access_token) gespeichert

[RoutePrefix("api/Customer")] 
public class CustomerController : ApiController 
{ 
    List<customer> list = new List<customer>() { new customer {id=1 ,customerName="Marry",age=13}, 
     new customer { id = 2, customerName = "John", age = 24 } }; 

    [Route("GetExployeeByID/{id:long}")] 
    [HttpGet] 
    [Authorize] 
    public customer GetExployeeByID(long id) 
    {  
     return list.FirstOrDefault(x=>x.id==id); 
    } 

} 

Update 1 das ist mein Ajax-Post die api nach dem Login

function lgetemp() { 
    $.ajax({ 
     url: 'http://www.azapi.com:81/api/customer/GetExployeeByID/1', 
     datatype:"json", 
     type: 'get', 
     headers: { 
      "access_token":sessionStorage.getItem("token") 
     }, 
     crossDomain: true, 
     success: function (data) { 
      debugger 
      alert(data.customerName) 
     }, 
     error: function (err) { 
      debugger 
      alert('error') 
     } 

    }) 
} 

Antwort

0

Sie das Token passieren sollte anrufen in der Kopfzeile der Anfrage vom Client an die API

Authorization Basic yJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY= 

Die von Ihrer API können Sie die Header abfragen und das Token herausziehen.

string authorizationHeader = HttpContext.Current.Request.Headers["Authorization"]; 
string toke = authorizationHeader.Replace("Bearer ", String.Empty); 

Was ich auf meinem neuesten Projekt getan haben, ist eine Klasse AuthToken, die viel für mich tut

public class AuthToken : IAuthToken 
{ 
    private string _raw; 
    private IDictionary<string, string> _deserialized; 

    public string Raw 
    { 
     get 
     { 
      if (String.IsNullOrWhiteSpace(_raw)) 
      { 
       string authorizationHeader = HttpContext.Current.Request.Headers["Authorization"]; 
       _raw = authorizationHeader.Replace("Bearer ", String.Empty); 
      } 
      return _raw; 
     } 
    } 

    public IDictionary<string, string> Deserialized 
    { 
     get 
     { 
      if (_deserialized == null) 
      { 
       string[] tokenSplit = Raw.Split('.'); 
       string payload = tokenSplit[1]; 
       byte[] payloadBytes = Convert.FromBase64String(payload); 
       string payloadDecoded = Encoding.UTF8.GetString(payloadBytes); 
       _deserialized = JsonConvert.DeserializeObject<IDictionary<string, string>>(payloadDecoded); 
      } 
      return _deserialized; 
     } 
    } 
} 

Dann spritze ich in eine UserContext Klasse, die ich in injizieren kann meine Controller usw. Der Benutzerkontext kann dann Ansprüche aus dem Token nach Bedarf herausziehen. (Vorausgesetzt, es ist ein JWT)

public class UserContext : IUserContext 
{ 
    private IList<Claim> _claims; 
    private string _identifier; 
    private string _email; 
    private string _clientId; 

    public IAuthToken Token { get; } 

    public IList<Claim> Claims 
    { 
     get 
     { 
      return _claims ?? (_claims = Token.Deserialized.Select(self => new Claim(self.Key, self.Value)).ToList()); 
     } 
    } 

    public string Identifier => _identifier ?? (_identifier = Token.Deserialized.ContainsKey("sub") ? Token.Deserialized["sub"] : null); 

    public string Email => _email ?? (_email = Token.Deserialized.ContainsKey(ClaimTypes.Email) ? Token.Deserialized[ClaimTypes.Email] : null); 

    public UserContext(IAuthToken authToken) 
    { 
     Token = authToken; 
    } 
} 
+0

nach dem Zurückgeben der Token an die API. Wie verifiziert man das? Hat Microsft dafür einen Code? –

+1

Das mein Freund ist eine andere Frage! :-) –

+0

weil ich das Token bereits in der Kopfzeile übergebe. und ich weiß nicht, wo ich weitermachen soll. vielleicht ist mein Kopf der Frage irgendwie irreführend –

0

Sie müssen den Token an den Request-Header zu übergeben und den Aufruf der API-URL zu machen. Die folgende Funktion kann aufgerufen werden, indem Sie die URL und das Token übergeben, die Sie haben.

static string CallApi(string url, string token) 
{ 
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
    using (var client = new HttpClient()) 
    { 
     if (!string.IsNullOrWhiteSpace(token)) 
     { 
      var t = JsonConvert.DeserializeObject<Token>(token); 

      client.DefaultRequestHeaders.Clear(); 
      client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.access_token); 
     } 
     var response = client.GetAsync(url).Result; 
     return response.Content.ReadAsStringAsync().Result; 
    } 
} 

Refer-Token based authentication in Web API für eine detaillierte Erklärung.