2015-02-05 6 views
10

ich OAuth-Authentifizierung in meinem Web-Api Projekt on these blog postsMit beiden OAuth und Basic Auth in Asp.Net Web Api mit Owin

Es funktioniert gut, einschließlich der Aktualisierungs-Token Logik implementiert haben.

Ich möchte für ein paar Anrufe für geplante Aufträge als auch eine Option für die Standardauthentifizierung hinzuzufügen.

Ich habe versucht, eine Basic-Auth-Lösung als Middleware-Zugabe, aber ich bin immer noch 401 für die Bearer-Token zu fragen bekommen.

ich bekommen kann es durch Entfernen des [autorisiert] Attribut aus diesen api Anrufen und Überprüfung manuell in Code zu arbeiten, wenn der Benutzer authentifiziert ist, aber scheint, wie der falsche Weg, es zu lösen.

Gibt es eine Möglichkeit, sowohl Grund Auth und OAuth-Authentifizierung mit Owin zu unterstützen?

Antwort

7

Wie über Sie Ihre Aktionen oder Controller-Attribut mit der Standardauthentifizierung mit dem Attribut implementieren möchten [OverrideAuthentication] Dann erstellen Sie benutzerdefinierte Authentifizierungsfilter Attribut, das unter

von Attribute, IAuthenticationFilter als Code erbt
public class BasicAuthenticationAttribute : Attribute, IAuthenticationFilter 
{ 
    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     var req = context.Request; 
     // Get credential from the Authorization header 
     //(if present) and authenticate 
     if (req.Headers.Authorization != null && "basic".Equals(req.Headers.Authorization.Scheme, StringComparison.OrdinalIgnoreCase)) 
     { 
      var rawCreds = req.Headers.Authorization.Parameter; 

      var credArray = GetCredentials(rawCreds); 

      var clientId = credArray[0]; 
      var secret = credArray[1]; 

      if (ValidCredentials(clientId, secret)) 
      { 
       var claims = new List<Claim>() 
         { 
         new Claim(ClaimTypes.Name, clientId) 
         }; 

       var identity = new ClaimsIdentity(claims, "Basic"); 
       var principal = new ClaimsPrincipal(new[] { identity }); 
       // The request message contains valid credential 
       context.Principal = principal; 
      } 
      else 
      { 
       context.ErrorResult = new UnauthorizedResult(new AuthenticationHeaderValue[0], context.Request); 
      } 

     } 
     else 
     { 
      context.ErrorResult = new UnauthorizedResult(new AuthenticationHeaderValue[0], context.Request); 
     } 

     return Task.FromResult(0); 
    } 

    private string[] GetCredentials(string rawCred) 
    { 

     var encoding = Encoding.GetEncoding("UTF-8"); 

     var cred = encoding.GetString(Convert.FromBase64String(rawCred)); 

     var credArray = cred.Split(':'); 

     if (credArray.Length == 2) 
     { 
      return credArray; 
     } 
     else 
     { 
      return credArray = ":".Split(':'); 
     } 

    } 

    private bool ValidCredentials(string clientId, string secret) 
    { 

     //compare the values from web.config 

     if (clientId == secret) 
     { 
      return true; 
     } 
     return false; 
    } 

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context,CancellationToken cancellationToken) 
    { 
     context.Result = new ResultWithChallenge(context.Result); 
     return Task.FromResult(0); 
    } 

    public class ResultWithChallenge : IHttpActionResult 
    { 
     private readonly IHttpActionResult next; 
     public ResultWithChallenge(IHttpActionResult next) 
     { 
      this.next = next; 
     } 
     public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
     { 
      var response = await next.ExecuteAsync(cancellationToken); 
      if (response.StatusCode == HttpStatusCode.Unauthorized) 
      { 
       response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Basic")); 
      } 
      return response; 
     } 
    } 

    public bool AllowMultiple 
    { 
     get { return false; } 
    } 
} 

Jetzt können Sie es verwenden, um unten Attribut Sie Controller oder Aktionen wie der Code:

[OverrideAuthentication] 
    [BasicAuthentication] 
    [Route("")] 
    public async Task<IHttpActionResult> Get() 
{ 
} 

Beachten Sie, wie wir Ansprüche Identität und Einstellung der Authentifizierungsschema Basis erstellen, können Sie pu keinerlei Ansprüche Sie hier wollen.

+0

Ich habe verwendete Filter für benutzerdefinierte Authentifizierung in früheren Projekten, ich denke, für ein paar Anrufe in einer API, die vor alles andere Auth Systeme verwenden diese mehr Sinn als eine Owin Middleware machen, die bei jedem Aufruf für einen grundlegenden auth-Header suchen ausführt – EShy

Verwandte Themen