wake-up-neo.com

OAuth-Trägerzeichen in c # manuell dekodieren

In meiner auf Web Api 2.2 basierenden OWIN-basierten Anwendung habe ich eine Situation, in der ich das Trägertoken manuell decodieren muss, aber ich weiß nicht, wie ich das tun soll ... Dies ist mein startup.cs 

public class Startup
{
    public static OAuthAuthorizationServerOptions OAuthServerOptions { get; private set; }
    public static UnityContainer IoC;
    public void Configuration(IAppBuilder app)
    {
        //Set Auth configuration
        ConfigureOAuth(app);

        ....and other stuff
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new AuthProvider(IoC.Resolve<IUserService>(), IoC.Resolve<IAppSettings>())
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}

In meinem Controller sende ich das Trägertoken als Parameter 

[RoutePrefix("api/EP")]
public class EPController : MasterController
{
    [HttpGet]
    [AllowAnonymous]
    [Route("DC")]
    public async Task<HttpResponseMessage> GetDC(string token)
    {
        //Get the claim identity from the token here
        //Startup.OAuthServerOptions...

        //..and other stuff
    }
}

Wie kann man die Ansprüche manuell dekodieren und von dem als Parameter übergebenen Token abrufen? 

NOTE: Ich weiß, ich kann das Token im Header senden und [Authorize] und (ClaimsIdentity) User.Identity usw. verwenden. Die Frage ist jedoch, wie das Token gelesen werden soll, wenn es nicht im Header angezeigt wird. 

7
Marcus Höglund

Ich habe ein Beispielprojekt zur Deserialisierung von Trägertokens erstellt, die mit dem MachineKeyDataProtector ..__ verschlüsselt werden. Sie können den Quellcode betrachten.

Träger-Token-Deserializer

4
Legends

Platzieren Sie dies hier für andere, die in der Zukunft besuchen könnten. Die Lösung unter https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ ist einfacher.

Nur 2 Zeilen:

var secureDataFormat = new TicketDataFormat(new MachineKeyProtector());
AuthenticationTicket ticket = secureDataFormat.Unprotect(accessToken);



private class MachineKeyProtector : IDataProtector {
    private readonly string[] _purpose =
    {
        typeof(OAuthAuthorizationServerMiddleware).Namespace,
        "Access_Token",
        "v1"
    };

    public byte[] Protect(byte[] userData)
    {
        throw new NotImplementedException();
    }

    public byte[] Unprotect(byte[] protectedData)
    {
        return System.Web.Security.MachineKey.Unprotect(protectedData, _purpose);
    } }
10
Osa E

Sie können JWT lesen und Principals and Identity-Objekt mit dem Paket System.IdentityModel.Tokens.Jwt - https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ erstellen. 

Hier ein kurzes Beispiel, das die verfügbaren Optionen beim Lesen und Validieren des Tokens zeigt. 

    private ClaimsIdentity GetIdentityFromToken(string token, X509Certificate2 certificate)
    {  
        var tokenDecoder = new JwtSecurityTokenHandler();         
        var jwtSecurityToken = (JwtSecurityToken)tokenDecoder.ReadToken(token);

        SecurityToken validatedToken;

        var principal = tokenDecoder.ValidateToken(
            jwtSecurityToken.RawData,
            new TokenValidationParameters()
                {
                    ValidateActor = false,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateLifetime = false,
                    ValidateIssuerSigningKey = false,
                    RequireExpirationTime = false,
                    RequireSignedTokens = false,
                    IssuerSigningToken = new X509SecurityToken(certificate)
                },
            out validatedToken);

        return principal.Identities.FirstOrDefault();
    }
0
Dylan Morley