2017-01-24 3 views
0

У меня есть сторонние поставщики входа (google и microsoft) на Azure для моего веб-приложения. Я также добавляю пользовательский логин (в случае, если у пользователя нет одной из этих учетных записей). У меня есть маркер генерируется следующим образом:Как вы проверяете JwtSecurityToken, подписанный с помощью WEBSITE_AUTH_SIGNING_KEY?

private JwtSecurityToken GenerateToken(User user) 
{ 
    var audience = ConfigurationManager.AppSettings["ValidAudience"]; 
    var issuer = ConfigurationManager.AppSettings["ValidIssuer"]; 

    JwtSecurityToken token = AppServiceLoginHandler.CreateToken(new Claim[] { new Claim(JwtRegisteredClaimNames.Sub, user.AzureUserID) }, 
     GetSigningKey(), 
     audience, 
     issuer, 
     TimeSpan.FromHours(1)); 

    return token; 
} 

Где GetSigningKey() возвращает строку переменной Azure среды WEBSITE_AUTH_SIGNING_KEY. Аутентификация по умолчанию с моими контроллерами API отлично работает, но когда мне нужно обновить токен из-за истечения срока его действия, у меня возникла проблема с подтверждением его подписи. Есть много примеров того, как проверить JwtSecurityTokens, но я не смог их найти, когда вы подписали его с помощью WEBSITE_AUTH_SIGNING_KEY. Вот что я пытался получить без успеха:

var validationParameters = new TokenValidationParameters 
{ 
    ValidAudience = ConfigurationManager.AppSettings["ValidAudience"], 
    ValidIssuer = ConfigurationManager.AppSettings["ValidIssuer"], 
    IssuerSigningToken = <I think I need this, but not sure how to populate it...>, 

    ValidateAudience = true, 
    ValidateIssuer = true, 
    ValidateIssuerSigningKey = true 
}; 

SecurityToken validatedToken; 
tokenHandler.ValidateToken(expiredAccessToken, validationParameters, out validatedToken); 

Есть ли у кого-нибудь идеи о том, как проверить токен?

ответ

0

App Settings (в том числе ключа подписи вы упомянули) появляется в качестве переменных окружения, так что вы можете использовать либо ConfigurationManager прочитать его, или вы можете использовать обычное переменное окружение чтение для ASP.NET

Try:

ConfigurationManager.AppSettings["WEBSITE_AUTH_SIGNING_KEY"] 
+0

Спасибо Адриану, но мой вопрос заключался не в том, как получить эту переменную окружения, а в том, как читать JwtSecurityToken, который уже был с ней связан. – lehn0058

+0

В службе поддержки приложений он валидирован для вас. Просмотрите блог по адресу http://cgillum.tech - он содержит подробные сведения о том, что происходит под обложками, поэтому вы можете обойти проверку и просто прочитать претензии из переменных окружения и/или /.auth/me endpoint. –

+1

Я могу обойти проверку подлинности, просто купив, просто удалив тег Authorize из моего метода контроллера. Мое дело в том, что я хочу сделать это, потому что у меня есть собственный пользовательский логин в дополнение к сборке в провайдерах (google и microsoft), и мне нужно обновить токен, срок действия которого истек. Мой вопрос состоял в том, как я все еще проверяю токен (который я, безусловно, НЕ пропускаю, поскольку любой вредоносный пользователь может отправить мне токен), когда он был подписан с помощью WEBSITE_AUTH_SIGNING_KEY. См. Мой ответ ниже, как я получил это, чтобы работать. – lehn0058

0

Рытье через модульные тесты на GitHub для проекта azure-mobile-apps-net-server, я нашел AppServiceTokenHandler, что делает трюк:

// Validate that the token was generated by our server. 
var validationParameters = new TokenValidationParameters 
{ 
    ValidAudience = ConfigurationManager.AppSettings["ValidAudience"], 
    ValidIssuer = ConfigurationManager.AppSettings["ValidIssuer"], 

    ValidateAudience = true, 
    ValidateIssuer = true, 
    ValidateIssuerSigningKey = true, 
    ValidateLifetime = false // The token is valid for this test case whether or not it is expired. 
}; 

ClaimsPrincipal claimsPrincipal; 
if (AppServiceTokenHandler.TryValidateToken(validationParameters, expiredAccessToken, GetSigningKey(), out claimsPrincipal)) 
{ 
    // Token is validated 
} 
Смежные вопросы