Как вручную проверить ядро ​​JWT Asp.Net?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как вручную проверить ядро ​​JWT Asp.Net?

Сообщение Anonymous »

Существуют миллионы руководств, и ни одно из них не делает того, что мне нужно. Я создаю сервер аутентификации, которому просто нужно просто выпустить и проверить/перевыпустить токены. Поэтому я не могу создать класс промежуточного программного обеспечения для «ПРОВЕРКИ» файла cookie или заголовка. Я просто получаю POST строки, и мне нужно проверить токен таким образом, вместо промежуточного программного обеспечения Authorize, которое предоставляет ядро ​​.net.

Мой стартап представляет собой единственный пример эмитента токенов, с которым я смог работать.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

app.UseExceptionHandler("/Home/Error");

app.UseStaticFiles();
var secretKey = "mysupersecret_secretkey!123";
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));

var options = new TokenProviderOptions
{

// The signing key must match!
Audience = "AllApplications",
SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256),

Issuer = "Authentication"
};
app.UseMiddleware(Microsoft.Extensions.Options.Options.Create(options));


Я могу использовать промежуточное программное обеспечение при создании, поскольку мне просто нужно перехватить тело имени пользователя и пароля. Промежуточное программное обеспечение принимает параметры из предыдущего кода Startup.cs, проверяет путь запроса и генерирует токен из контекста, показанного ниже.

private async Task GenerateToken(HttpContext context)
{
CredentialUser usr = new CredentialUser();

using (var bodyReader = new StreamReader(context.Request.Body))
{
string body = await bodyReader.ReadToEndAsync();
usr = JsonConvert.DeserializeObject(body);
}

///get user from Credentials put it in user variable. If null send bad request

var now = DateTime.UtcNow;

// Specifically add the jti (random nonce), iat (issued timestamp), and sub (subject/user) claims.
// You can add other claims here, if you want:
var claims = new Claim[]
{
new Claim(JwtRegisteredClaimNames.Sub, JsonConvert.SerializeObject(user)),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, now.ToString(), ClaimValueTypes.Integer64)
};

// Create the JWT and write it to a string
var jwt = new JwtSecurityToken(
issuer: _options.Issuer,
audience: _options.Audience,
claims: claims,
notBefore: now,
expires: now.Add(_options.Expiration),
signingCredentials: _options.SigningCredentials);
var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

///fill response with jwt
}


Этот большой блок кода, приведенный выше, десериализует CredentialUser json, а затем выполнит хранимую процедуру, которая возвращает объект User. Затем я добавлю три претензии и отправлю их обратно.

Я могу успешно сгенерировать jwt и, используя онлайн-инструмент, такой как jwt.io, помещаю секрет ключ, и инструмент говорит, что он действителен, с объектом, который я мог бы использовать

{
"sub": " {User_Object_Here} ",
"jti": "96914b3b-74e2-4a68-a248-989f7d126bb1",
"iat": "6/28/2017 4:48:15 PM",
"nbf": 1498668495,
"exp": 1498668795,
"iss": "Authentication",
"aud": "AllApplications"
}


Проблема, с которой я столкнулся, заключается в том, как вручную проверять утверждения на соответствие подписи. Так как это сервер, который выдает и проверяет токены. Настройка промежуточного программного обеспечения Authorize невозможна, как это делается в большинстве руководств. Ниже я пытаюсь проверить токен.

[Route("api/[controller]")]
public class ValidateController : Controller
{

[HttpPost]
[ValidateAntiForgeryToken]
public async Task Validate(string token)
{
var validationParameters = new TokenProviderOptions()
{
Audience = "AllMyApplications",
SigningCredentials = new
SigningCredentials("mysupersecret_secretkey!123",
SecurityAlgorithms.HmacSha256),

Issuer = "Authentication"
};
var decodedJwt = new JwtSecurityTokenHandler().ReadJwtToken(token);
var valid = new JwtSecurityTokenHandler().ValidateToken(token, //The problem is here
/// I need to be able to pass in the .net TokenValidParameters, even though
/// I have a unique jwt that is TokenProviderOptions. I also don't know how to get my user object out of my claims
}
}


Подробнее здесь: https://stackoverflow.com/questions/448 ... p-net-core
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»