Нашли решение.
1-й Как добавить пользовательские переменные в токен, который находится в RS256.
Вам не нужно.Токены, полученные от внешней службы с OpenId connect, в основном для аутентификации, а не для авторизации.Мы можем использовать несколько внешних служб аутентификации, добавление пользовательских утверждений здесь не будет хорошей идеей, и это также не должно быть сделано.
2nd Как сохранить их в cookie?
Это место быломы можем изменить наш токен.Cookie не находится в том же симметричном шифре, что и внешний сервис аутентификации.Мы можем перехватить метод проверки подлинности cookie, чтобы добавить пользовательские утверждения.
Вот как я это сделал:
CustomSecureDataFormat.cs
public class CustomSecureDataFormat : ISecureDataFormat<AuthenticationTicket>
{
public string Protect(AuthenticationTicket data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var claims = new List<Claim>();
//Custom claim
claims.Add(new Claim("HairCount", "46"));
data.Identity.AddClaims(claims);
string audienceId = AzureADConstants.GraphResourceId;
Guid guidClientId;
bool isValidAudience = Guid.TryParse(AzureADConstants.ClientId, out guidClientId);
if (!isValidAudience)
{
throw new InvalidOperationException("AuthenticationTicket.Properties does not include audience");
}
var keyByteArray = TextEncodings.Base64Url.Decode(AzureADConstants.AppKey);
var securityKey = new SymmetricSecurityKey(keyByteArray);
var signingCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(
securityKey,
SecurityAlgorithms.HmacSha256Signature);
var issued = data.Properties.IssuedUtc;
var expires = data.Properties.ExpiresUtc;
string _issuer = AzureADConstants.Authority;
var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingCredentials);
var handler = new JwtSecurityTokenHandler();
return handler.WriteToken(token);
}
public AuthenticationTicket Unprotect(string protectedText)
{
if (string.IsNullOrWhiteSpace(protectedText))
{
throw new ArgumentNullException("protectedText");
}
var keyByteArray = TextEncodings.Base64Url.Decode(AzureADConstants.AppKey);
var securityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(keyByteArray);
var signingCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(
securityKey,
SecurityAlgorithms.HmacSha256Signature);
var handler = new JwtSecurityTokenHandler();
var securityToken = handler.ReadToken(protectedText);
string rawToken = ((JwtSecurityToken)securityToken).RawData;
string audienceId = AzureADConstants.GraphResourceId;
var validationParams = new TokenValidationParameters()
{
ValidateLifetime = false,
ValidAudience = audienceId,
ValidIssuer = audienceId,
ValidateIssuer = false,
ValidateAudience = false,
TokenDecryptionKey = securityKey,
IssuerSigningKey = securityKey
};
SecurityToken validatedToken;
var principal = handler.ValidateToken(rawToken, validationParams, out validatedToken);
var identity = principal.Identities;
return new AuthenticationTicket(identity.First(), new AuthenticationProperties());
}
}
Startup.Auth.cs
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
LoginPath = Microsoft.Owin.PathString.FromUriComponent("/Account/SignIn"),
TicketDataFormat = new CustomSecureDataFormat()
});