2016-11-25 27 views
6

Trong ứng dụng dựa trên Apache Api của tôi, tôi có một tình huống mà tôi cần giải mã mã thông báo mang nhưng tôi không biết cách thực hiện điều này. Đây là startup.cs tôiThủ công giải mã mã thông báo OAuth trong C#

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()); 
    } 
} 

Trong điều khiển của tôi Im gửi token bearer như một tham số

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

Làm thế nào để tự giải mã và nhận được khiếu nại từ các dấu hiệu thông qua như là một tham số?

LƯU Ý: Tôi biết tôi có thể gửi mã thông báo trong tiêu đề và sử dụng [Duyệt] và (ClaimsIdentity) User.Identity vv nhưng câu hỏi là làm thế nào để đọc các dấu hiệu khi nó không được thể hiện trong tiêu đề.

Trả lời

2

Tôi tạo ra một dự án mẫu cho deserializing thẻ vô danh, được mã hóa bằng cách sử dụng MachineKeyDataProtector. Bạn có thể xem mã nguồn.

Bearer-Token-Deserializer

+0

Cảm ơn, Chỉ những gì tôi đang tìm kiếm! Tuyệt vời –

+0

Mặc dù ở trên có thể hoạt động. Bạn có thể tìm thấy một giải pháp đơn giản hơn tại https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ –

0

Bạn có thể đọc JWT và tạo đối tượng Gốc và Định danh bằng cách sử dụng gói System.IdentityModel.Tokens.Jwt - https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/.

Dưới đây là một ví dụ nhanh cho thấy các tùy chọn có sẵn khi đọc và xác nhận được dấu hiệu,

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

Người mang thẻ trong danh asp.net không phải là một dấu hiệu JWT. Mã thông báo jwt sẽ giống như: header.payload.signature. Mã thông báo mang mà tôi nhận được không chứa các dấu chấm và mã base64 không được mã hóa của nó. – Marius

4

Chỉ cần đặt này ở đây cho những người khác mà có thể truy cập trong tương lai. Giải pháp tìm thấy tại https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ là đơn giản hơn.

Chỉ cần 2 dòng:

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); 
    } } 
+0

Mặc dù tôi chưa thử nghiệm giải pháp này nhưng tôi nghĩ rằng bạn nên dành thời gian và chia sẻ giải pháp của mình câu hỏi khép kín +1 –

Các vấn đề liên quan