Существуют миллионы руководств, и ни одно из них не делает того, что мне нужно. Я создаю сервер аутентификации, которому просто нужно просто выпустить и проверить/перевыпустить токены. Поэтому я не могу создать класс промежуточного программного обеспечения для «ПРОВЕРКИ» файла 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
Как вручную проверить ядро JWT Asp.Net? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение