2016-10-26 3 views
0

Ich bin migriert meine ältere App geschrieben in (VS2013) MVC5 mit Angular 1 zu (VS2015) MVC 6 mit Angular 2. In meiner MVC 5 App, die ich früher verwendet erhalten ein Token von dem Client in einer post Aktionsmethode auf der Web-Benutzeroberfläche Seite, die ich verwendet, um dann zu speichern, um Sitzung die folgenden Zeilen von Code verwendet:Verwendung eines JWT von Angular an eine Aspnet Core 1.0 Website gesendet

//Store token details 
[HttpPost] 
public void EvaluateToken(string token) 
{ 
    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); 
    SecurityToken st = tokenHandler.ReadToken(token); 
    var tokenData = ((JwtSecurityToken)st); 
    var claims = tokenData.Claims.Where(t => t.Type.Equals(" ")).ToList(); 

    ClaimsIdentity cIdentity = new ClaimsIdentity(DefaultAuthenticationTypes.ExternalBearer); 
    ci.AddClaims(claims); 
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, cIdentity); 

    string user = "//get username from token"; 

    ClaimsPrincipal cPrincipal = new ClaimsPrincipal (cIdentity); 

    //write to cookie 
    SessionSecurityToken sst = new SessionSecurityToken(cPrincipal , TimeSpan.FromMinutes(20)); 
    sst.IsReferenceMode = true; 
    SessionAuthenticationModule ssm = FederatedAuthentication.SessionAuthenticationModule; 
    ssm.WriteSessionTokenToCookie(sst); 
} 

der obige Code auch für nicht-aspnetcore Projekten arbeitet und ich bin in der Lage, die Ansprüche aus dem Autorisierungskontext unter Verwendung der folgenden Codezeilen abzurufen, wobei action den Anspruch enthält, der für das Attribut über die jeweilige aufgerufene Aktionsmethode gesetzt wurde und val einen bool true oder false des angegebenen Anspruchs enthält oder nicht i n die context.Principal.

public class CustomClaimsAuthorizationManager: ClaimsAuthorizationManager 
{ 

    public override bool CheckAccess(AuthorizationContext context) 
    { 
     var action = context.Action.First().Value; 
     bool val= context.Principal.HasClaim(" ", action); 
     return val; 
    } 
} 

Wenn jedoch zu einem Kernprojekt bewegen, bekomme ich diesen Fehler:

ID1061: HttpContext.Current is null. This code path is only valid when in the execution context of ASP.NET.

auf dieser Code-Zeile in meiner EvaluateToken Methode:

SessionAuthenticationModule ssm = FederatedAuthentication.SessionAuthenticationModule; 

Ich brauche diese Zeile Wenn ich versuche, auf eine Aktionsmethode zuzugreifen, die mein benutzerdefiniertes Anspruchsattribut enthält, sollte ich in der Lage sein zu bewerten, ob der Anspruch im Token existiert oder nicht. Wenn es keine Möglichkeit gibt, diese as-is zu aspnet Kern zu verschieben, dann möchte ich wissen, wie in Aspnet-Core kann ich ein Token verwenden, um den Zugriff auf eine bestimmte Ansicht mit nur das übergebene Token und die Zielgruppe, Aussteller und geheimen Schlüssel zu autorisieren verwendet, um das Token zu generieren. Die Dokumentation gibt an, benutzerdefinierte Richtlinien hinzuzufügen und scheint einen anderen Pfad zu verwenden. Ich bin mir nicht sicher, wie diese Art von Logik zum Speichern der Ansprüche in einem Hauptobjekt auf der UI-Seite verwendet wird, damit sie beim Verschieben zwischen Ansichten auf der UI-Seite verwendet werden kann. Diese

ist, was ich habe in meinem startup.cs auf dem aspnet Kernbahn-Projekt in der Configure-Methode Datei:

var issuer = "localhost"; 
var aud = "localhost"; 
var secret = "SecretValueHere"; 

var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret)); 

      var jwtBearerOptions = new JwtBearerOptions 
      { 
       AutomaticAuthenticate = true, 
       AutomaticChallenge = true, 
       Audience = aud , 
       ClaimsIssuer = issuer, 
       TokenValidationParameters = new TokenValidationParameters 
       { 
        ValidateIssuerSigningKey = true, 
        IssuerSigningKey = signingKey, 
        ValidateIssuer = true, 
        ValidIssuer = issuer, 
        ValidateAudience = true, 
        ValidAudience = aud , 
        ValidateLifetime = true, 
        ClockSkew = TimeSpan.Zero, 
        RequireExpirationTime = true 
       } 
      }; 

      app.UseJwtBearerAuthentication(jwtBearerOptions); 

Antwort

0

ID1061: HttpContext.Current is null. This code path is only valid when in the execution context of ASP.NET.

HttpContext.Current in Aspnet Kern nicht zur Verfügung steht. Siehe Access HttpContext.Current.

I need this line to work so that when I try to access an action method that has my custom claim attribute, I should be able to evaluate if the claim in the token exists or not

Sie brauchen nur (Ich gehe davon aus Ansprüchen in Token gespeichert werden):

  1. JWT Authentifizierungs-Middleware (Sie es schon versucht)
  2. Claims Based Authorization.

Sollten Sie zusätzliche Ansprüche müssen nicht in Token gespeichert, dann können Sie Claims Transformation oder OnTokenValidated Ereignis von jwt Authentifizierung Middleware verwenden.

+0

Ich verwende das Attribut "ClaimsPrinciplePermission" und nicht das Attribut "Authorize". Gibt es eine Möglichkeit, dies mit "ClaimsPrinciplePermission" in aspnet core zu tun? oder muss ich das alles zur Autorisierung verschieben? – user20358

+0

Gibt es einen besonderen Grund, ClaimsPrinciplePermission für Ihren Fall zu verwenden? Wenn nicht, würde ich autorisieren Attribut verwenden. –

+0

Ich migrieren Legacy-Code in Aspnet-Core. Dafür müsste es viele Nacharbeiten geben. In einem verwandten Hinweis habe ich versucht, was Sie erwähnt haben, dieses Beispiel hier zu verwenden, um eine Anmeldung (http://andrewlock.net/introduction-to-authentication-with-asp-net-core/) und dieses Beispiel (https: //docs.asp.net/en/latest/security/authorisation/policies.html), um eingehende Ansprüche zu bewerten. Die Liste der Ansprüche in der Eigenschaft AuthorizationHandlerContext context gibt jedoch kein Ergebnis zurück. Warum ist das? – user20358

Verwandte Themen