2014-02-07 6 views
1

사용자가 인증되면 응답 인증 헤더에 서명 된 토큰을 넣습니다.편안한 웹 API에서 후속 요청에 대한 토큰 서명 유효성 검사

ressource URL에 대한 모든 액세스는 유효한 서명 된 토큰과 함께 허용됩니다.

나는 토큰을 생성하고이를 valdiate 경우 :

var principal = tokenHandler.ValidateToken(tokenString, validationParameters); 

는 내가 교장 서명 키가 토큰을 생성하여 사용

을 가지고있는 동일한 경우 (요청을 만든 사용자)를 얻을 .

나는이 클래스 생성 한 토큰의 유효성을 검사 인증 후와 ressource 요청시 동일한 서명 키를 사용할 수 있습니다 : 나는 정적 클래스에서이 코드를 넣어 아무 잘못이

public static class ApiConstants 
{ 
    private static readonly RNGCryptoServiceProvider CryptoProvider = new RNGCryptoServiceProvider(new byte[33]); 
    private static byte[] key = new byte[32]; 

    static ApiConstants() 
    { 
     CryptoProvider.GetBytes(key); 
    } 

    public static byte[] GetSignedKey() 
    { 
     return key; 
    } 
} 

거기를하는 실제로 한 번만 발생하는 임의의 숫자로 바이트 배열 채우기를 원하는대로 실제로 내 전체 목적입니다!

개선할만한 것이 있습니까?

답변

0

사용자는 서명 토큰을 정적으로 만들 수 없습니다. 그 이유는 전역 변수가되어 모든 요청 (스레드)에 의해 공유되기 때문입니다. 또한 정적 필드에 동시성 문제가 발생합니다.

세션별로 설정하려면 다음과 같이하십시오. 정적 필드가 아닌 세션 변수에 저장해야합니다.

+0

문제는 토큰을 생성하고 토큰의 유효성을 검사하는 시간이 하나의 요청 내에 있지 않기 때문에 유효하지 않은 토큰을 만들 때 validateToken과 동일한 비밀 키를 사용하는 방법은 무엇일까요? 내 http API에서 REST 원칙을 따르기 때문에 서버 측에서 세션/쿠키를 사용하지 않습니다. – HelloWorld

+0

아마도 비밀 키 생성을 인터페이스에 넣고 autoface를 통해 공유 싱글 톤인 .SingleInstance를 삽입해야 할 수도 있습니다. – HelloWorld

+0

생성 된 토큰을 모든 요청에 ​​공유 할 수 있으면 클래스를 정적으로 설정하는 것이 좋습니다. 모든 사용자/요청에 대해 한 번 생성 된 토큰이 될 것이라고 말합니다. –