web-dev-qa-db-ja.com

手動でデコードOAuth C#のベアラートークン

私のWeb Api 2.2 OWINベースのアプリケーションで、手動で署名なしトークンをデコードする必要がある状況にありますが、これを行う方法がわかりません。これは私の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());
    }
}

私のコントローラーでは、パラメーターとして無記名トークンを送信しています。

[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
    }
}

パラメーターとして渡されたトークンからクレームを手動でデコードして取得する方法は?

[〜#〜] note [〜#〜]:ヘッダーでトークンを送信し、[Authorize]や(ClaimsIdentity)User.Identityなどを使用できることはわかっていますが、質問は、ヘッダーに表示されていない場合のトークン。

10
Marcus Höglund

MachineKeyDataProtectorを使用して暗号化されたベアラートークンを逆シリアル化するためのサンプルプロジェクトを作成しました。ソースコードを見ることができます。

Bearer-Token-Deserializer

6
Legends

将来訪問するかもしれない他の人のためにこれをここに置くだけです。 https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ にある解決策の方が簡単です。

ちょうど2行:

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);
    } }
15
Osa E

System.IdentityModel.Tokens.Jwtパッケージ- https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ を使用して、JWTを読み取り、プリンシパルとIDオブジェクトを作成できます。

トークンを読み取って検証するときに使用できるオプションを示す簡単な例を次に示します。

    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