Как включить претензии в токен JWT? - PullRequest
0 голосов
/ 23 сентября 2019

Привет, я занимаюсь разработкой веб-приложения в ядре .Net.Я реализовал аутентификацию V2.Теперь у меня есть требование добавить авторизацию.Требование гласит, что во-первых,

Работа приложения не должна собирать заявления пользователя, они должны быть доступны в JWT пользователей.Во-вторых, разрешения для приложения будут предоставляться на основе утверждений.

Ниже приведен мой код проверки подлинности.

 services
               .AddAuthentication(o =>
               {
                   o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

               })
               .AddJwtBearer(o =>
               {
                   o.Authority = azureActiveDirectoryOptions.Authority;

                   o.TokenValidationParameters = new TokenValidationParameters
                   {

                       ValidAudiences = new List<string>
                       {
                          azureActiveDirectoryOptions.AppIdUri,
                          azureActiveDirectoryOptions.ClientId
                       },
                   };
               });

            services.AddMvc(options =>
            {

                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Может ли кто-нибудь помочь мне добавить авторизацию на основе утверждений?Любая помощь будет принята с благодарностью.Спасибо

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Для части авторизации вы можете добавить роли приложения в ваше приложение , назначить роли пользователям / группам, чтобы roles включало в токен после входа и согласия пользователя, чтобы ваше приложение могло использовать политику дляограничить доступ на основе заявления roles.

Другой подход заключается в использовании групп Azure AD и утверждений группы .Разница в том, что ваша заявка должна проверить groups претензию,

1 голос
/ 23 сентября 2019

Вы можете использовать приведенный ниже код для добавления пользовательской заявки в токен JWT.

public string createToken()
{
    var tokenHandler = new JwtSecurityTokenHandler();

    //create a identity and add claims to the user which we want to log in
    ClaimsIdentity claimsIdentity = new ClaimsIdentity(new[]
    {
        new Claim("UserName", "joey"),
        new Claim("Email","xxx@test.com")
    });

    const string sec = "yoursecurityKey";
    var now = DateTime.UtcNow;
    var securityKey = new SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec));
    var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);

    //create the jwt
    var jwtSecurityToken = handler.CreateJwtSecurityToken(
        "issuer",
        "Audience",
        new ClaimsIdentity(claimsIdentity),
        DateTime.Now,
        DateTime.Now.AddHours(1),
        DateTime.Now,
        signingCredentials);
    var tokenString = tokenHandler.WriteToken(token);

    return tokenString;
}

Для получения дополнительной информации см. Это статья .

Обновление:

Если это так, вы можете использовать JwtBearerEvents для добавления претензии.

 .AddJwtBearer(o =>
 {
     //Additional config snipped
     o.Events = new JwtBearerEvents
     {
         OnTokenValidated = async ctx =>
         {
             //Get the calling app client id that came from the token produced by Azure AD
             string clientId = ctx.Principal.FindFirstValue("appid");
             var claims = new List<Claim>
             {
                 new Claim("UserName", "joey")
             };
             var appIdentity = new ClaimsIdentity(claims);

             ctx.Principal.AddIdentity(appIdentity);
         }
     };
});
...