2017-02-10 1 views
1

Ich lerne, neue benutzerdefinierte Middleware (externe Anmeldung) in WebApi zu implementieren, um Benutzer zu authentifizieren. Ich habe eine leere Vorlage verwendet, um zu lernen, was eigentlich läuft.Benutzer als authentifiziert von WebAPI benutzerdefinierte Middleware setzen

Ich habe ein paar gute Artikel und externe Anmeldung benutzerdefinierte Middleware-Anbieter Links, um mir zu helfen, dies zu erreichen.

  1. http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/
  2. https://www.simple-talk.com/dotnet/net-framework/creating-custom-oauth-middleware-for-mvc-5/
  3. https://github.com/TerribleDev/OwinOAuthProviders
  4. https://katanaproject.codeplex.com/SourceControl/latest#README

Basierend auf diesen Artikel fertig i benutzerdefinierte Middleware für Github und den Benutzer erfolgreich authentifiziert.

Jetzt muss ich verstehen, wie das Webapi-Identity-System den Benutzer authentifizierte und wie die externen Ansprüche dafür gespeichert werden. Nachdem ich mich erfolgreich von Dritten angemeldet habe, habe ich gerade Ansprüche erstellt und die SignIn-Methode aufgerufen.

Bis zu diesem alles richtig funktioniert.

Aber nachdem ich versucht habe, auf eine geschützte Ressource mit dem Zugriffstoken (das ist ein externer Zugriffstoken) zuzugreifen, habe ich nur Unauthorized. Ich nahm an, dass, da ich den Benutzer nicht zur lokalen Datenbank registriere, ich das gleiche externe Zugangstoken verwenden kann, um die Ressource zu benutzen.

Ich habe 2 Möglichkeiten ausprobiert. Zuerst wurde ich in der ExternalLogin-Methode selbst nach der Anmeldung zu der geschützten Ressource umgeleitet. Als nächstes versuchte ich mit Rest-Client.

Meine Auth Konfiguration Code:

[assembly: OwinStartup(typeof(CustomExternalLogin.Startup))] 
namespace CustomExternalLogin 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      // Enable the application to use a cookie to store information for the signed in user 
      // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

      //Use Git authentication 
      app.UseGitAuthentication("myclientid", "myclientsecret"); 
     } 
    } 
} 

Mein Controller-Code

[Authorize] 
    [RoutePrefix("api/Account")] 
    public class AccountController : ApiController 
    { 
     [OverrideAuthorization] 
     [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
     [AllowAnonymous] 
     [Route("ExternalLogin", Name ="ExternalLogin")] 
     public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 
     { 
      string redirectUri = string.Empty; 

      //Check any error and return 
      if(error != null) 
      { 
       return BadRequest(Uri.EscapeDataString(error)); 
      } 

      //if not current user is authenticated return challengeresult so that middleware continue for external authentication 

      if (!User.Identity.IsAuthenticated) 
      { 
       return new ChallengeResult(provider, this); 
      } 

      ClaimsIdentity externalIdentity = User.Identity as ClaimsIdentity; 
      Claim providerClaim = externalIdentity.FindFirst(ClaimTypes.NameIdentifier); 
      Claim userClaim = externalIdentity.FindFirst(ClaimTypes.Name); 

      string token = externalIdentity.FindFirstValue("ExternalAccessToken"); 
      IEnumerable<Claim> claims = new List<Claim> 
      { 
       new Claim(ClaimTypes.NameIdentifier, providerClaim.Value, null, providerClaim.Issuer), 
       new Claim(ClaimTypes.Name, userClaim.Value, null, userClaim.Issuer) 

      }; 

      ClaimsIdentity identity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType); 
      Authentication.SignIn(identity); 

      Uri currentUri = Request.RequestUri; 
      string home = currentUri.Scheme + Uri.SchemeDelimiter + currentUri.Authority + currentUri.Segments[0] + currentUri.Segments[1] + "Home/User?access_token=Bearer " + token ; 
      return Redirect(home); 
     } 

     #region Helpers 
     private IAuthenticationManager Authentication 
     { 
      get { return Request.GetOwinContext().Authentication; } 
     } 
     #endregion 
    } 
} 

Mein geschützte Ressource Code:

[Authorize] 
[Route("User", Name ="User")] 
public string GetUser() 
{ 
    var authentication = Request.GetOwinContext().Authentication; 

    return "Welcome " + User.Identity.Name; 
} 

Bitte helfen Sie mir, wo ich zu finden misse d

Edit 1:

bekam ich die aktuelle Ausgabe. Ich habe versucht, mit External Token zuzugreifen. WebAPI Authorize verifiziert das Token mit local, so dass es immer fehlgeschlagen ist. Die Lösung besteht also darin, ein lokales Zugriffstoken zu erstellen, und ich bin fertig. Funktioniert gut.

Aber zur Zeit überprüfe ich, warum die Authentication.Signin() -Methode kein Token für mich erstellt hat?

+0

In Ihrem Startup.cs erklären, haben Sie versucht, Einstellung Ihre Standardanmeldung Middleware wie folgt: 'app.SetDefaultSignInAsAuthenticationType (CookieAuthenticationDefaults.AuthenticationType);'? Dies sollte die erste Zeile dort sein. – juunas

+0

@juunas jetzt habe ich versucht, indem Sie diese Zeile als erste Zeile hinzufügen. Aber immer noch gleich. Ich denke, das ist Standard als "Cookies:" Nach der Authentifizierung.Signieren, wenn ich Anmeldeversuche Authentifizierungstyp ist "Bearer", also jede andere Konfiguration für Bearer-Token – Akhil

Antwort

0

Endlich habe ich es. Aus meiner Bearbeitung können wir verstehen, dass ein lokales Token benötigt wird, um Benutzer zu authentifizieren. Dazu können wir die Authentication.Signin() -Methode verwenden.

Option 1: Authentication.Signin()

Der wichtigste Punkt hier ist diese Authentifizierung verwendet Cookies, um Informationen und Inhaber Token zu speichern Benutzer zu authentifizieren.Also müssen wir die folgenden Zeilen in Auth Config enthalten:

public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 


    OAuthOptions = new OAuthAuthorizationServerOptions 
    { 
     Provider = new ApplicationOAuthProvider(PublicClientId), 
     AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
     AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
     // In production mode set AllowInsecureHttp = false 
     AllowInsecureHttp = true 
    }; 


    // Enable the application to use bearer tokens to authenticate users 
    app.UseOAuthBearerTokens(OAuthOptions); 

Jetzt Token generiert und authentifiziert erfolgreich. Der Nachteil dieser Methode ist, dass das Token immer zusammen mit der URL zurückgegeben wird. Für reine besser api Entwicklung json usw.

Option 2 zurückzukehren: Generieren Lokale Token und zurück als Objekt

Hier können wir einfach ein lokales Token als Objekt erstellen und zurückgeben, wie wir wollen. Dazu können wir OAuthBearerAuthenticationOptions verwenden.

Need den folgenden Code in Auth Config

public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; } 

    OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 

    app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Danach hinzuzufügen, können wir eine Hilfsmethode erstellen lokale Token zu erstellen. Dieses Verfahren ist bereits explainedand kann bin ich im folgenden Artikel Schritt 9.

http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/

Nun fand fine.If jeder mein Verständnis ist falsch bitte

Verwandte Themen