0

Ich lerne, wie die Asp.Net MVC Identity 2.0 funktioniert.Zerlegung der ASP.NET MVC-Identität für die OAuth-Bearer-Authentifizierung

Ich habe diesen Code,

[HttpGet] 
    [ActionName("Authenticate")] 
    [AllowAnonymous] 
    public String Authenticate(string user, string password) 
    { 
     if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password)) 
     { 
      return "Failed"; 
     } 

     var userIdentity = UserManager.FindAsync(user, password).Result; 
     if (userIdentity != null) 
     { 
      if (User.Identity.IsAuthenticated) 
      { 
       return "Already authenticated!"; 
      } 

      var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType); 
      identity.AddClaim(new Claim(ClaimTypes.Name, user)); 
      identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userIdentity.Id)); 

      AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties()); 
      var currentUtc = new SystemClock().UtcNow; 
      ticket.Properties.IssuedUtc = currentUtc; 
      ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(1)); 

      string AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket); 
      return AccessToken; 
     } 
     return "Failed in the end"; 
    } 

hier für OAuth-Träger funktioniert, ist der Code für Startup.Auth.cs

//This will used the HTTP header Authorization: "Bearer 1234123412341234asdfasdfasdfasdf" 
    OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
    app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

ich auf den Quellcode ausgesehen haben für ClaimsIdentity und AuthenticationTicket und ich sehe nicht, wie das Ticket für die Identität registriert ist.

Meine Frage ist, wie wurde dieses Ticket mit der Owin-Pipeline registriert?

Mein Ziel ist es, dieses Ticket wenn möglich zu widerrufen.

Vielen Dank im Voraus.

Antwort

0

Zunächst, hier ist ein great tutorial on ASP.NET Identity 2 von Taiseer Joudeh.

Dies ist die Zeile, die Bearer-Token-Verarbeitung zu einer OWIN-Anwendungspipeline hinzufügt.

app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Haben Sie den Autorisierungsanbieter auch selbst geschrieben? Mein Startcode sieht mehr wie folgt aus:

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

PublicClientId = "self"; 
OAuthServerOptions = new OAuthAuthorizationServerOptions 
{ 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/Token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1440),  //TODO: change to smaller value in production, 15 minutes maybe 
    Provider = new SimpleAuthorizationServerProvider(PublicClientId), 
    RefreshTokenProvider = new SimpleRefreshTokenProvider() 
}; 

app.UseOAuthAuthorizationServer(OAuthServerOptions); 

OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

Mein SimpleAuthorizationServerProvider hat dann eine Grant-Methode wie folgt:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin") ?? "*"; 

    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

    ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

    if (user == null) 
    { 
     context.SetError("invalid_grant", "The user name or password is incorrect."); 
     return; 
    } 

    var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())); 
    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
    identity.AddClaim(new Claim("sub", context.UserName)); 

    foreach (var role in userManager.GetRoles(user.Id)) 
    { 
     identity.AddClaim(new Claim(ClaimTypes.Role, role)); 
    } 

    var props = new AuthenticationProperties(new Dictionary<string, string> 
    { 
     {"as:client_id", context.ClientId ?? string.Empty} 
    }); 

    var ticket = new AuthenticationTicket(identity, props); 
    context.Validated(ticket); 
} 

So gut wie alles auf dem Tutorial wurde auf der Grundlage oben erwähnt. Ich hoffe es hilft.

aktualisieren Es gibt keine Standardmethode ein Token nach Taiseer on this page zu widerrufen.

von authentifizierten Benutzern Entziehen Zugang: Sobald der Benutzer lange Zugriffstoken lebte erhält er in der Lage sein werden, die Server-Ressourcen zugreifen solange seine Zugriffstoken nicht abgelaufen ist, gibt es keine Standardmethode zu Zugriffstoken widerrufen, es sei denn, der Autorisierungsserver implementiert die benutzerdefinierte Logik , die Sie zwingt, das generierte Zugriffstoken in der Datenbank zu speichern und Datenbankprüfungen mit jeder Anforderung durchzuführen. Aber mit refresh Token kann ein Systemadministrator Zugriff widerrufen, indem einfach das Löschen die Aktualisierungs-Token-Kennung aus der Datenbank so, sobald das System fordert neue Zugriffstoken der gelöschte Aktualisierungs-Token verwendet, werden die Autorisierung Server lehnen diese Anforderung, weil die Aktualisierungs-Token ist nicht mehr verfügbar (wir kommen mit mehr Details dazu).

Aber here is an interesting approach das kann erreichen, was Sie brauchen. Es wird nur ein bisschen von der benutzerdefinierten Implementierung benötigt.

+0

Vielen Dank für Ihre Antwort. Ja, ich habe Taiseers Tutorial studiert und es ist sehr gut. Der Code, den ich gepostet habe, funktioniert genauso gut. Was würde ich gerne wissen, wenn es eine Möglichkeit für mich gibt, das Ticket zu widerrufen? – superfly71

+0

@ superfly71 Ich habe den Beitrag aktualisiert. Ich denke, Sie müssen Refresh-Token implementieren, um das zu erreichen, was Sie wollen. – BBauer42

+0

Ich nahm tatsächlich einen Blacklist-Ansatz an, wie in dem von Ihnen angegebenen Link erwähnt. Ich habe nur auf einen besseren Ansatz gehofft. Trotzdem danke! – superfly71