2016-11-23 9 views
2

Я новичок в сервере идентификации и настроил его на свою разработку, и он в основном работает при использовании одного узла. Если я переключаюсь на 5 узлов, он иногда работает, а иногда нет.Service Fabric and Identity Server 4

У меня есть атрибут Authorize на контроллере, который расширяет базовый контроллер, который имеет функцию, которая получает роль пользователей от требований пользователей.

protected string GetUserRole() 
    { 
     var roleClaim = User.Claims.SingleOrDefault(c => c.Type == "role"); 

     if (roleClaim == null) 
     { 
      throw new ArgumentNullException("Cant find role claim on: " + Request.Host.Host); 
     } 
     else 
     { 
      return roleClaim.Value; 
     } 
    } 

Что произойдет, когда я оформлю санкционированный вызов (с маркером в заголовке), что roleClaim равно нулю, когда он выходит из строя. Затем я попытался позвонить, но на этот раз несанкционирован и получил тот же результат.

Это конфигурация для моего API:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = "http://localhost:19081/App/Identity", 
      ScopeName = "api1", 
      RequireHttpsMetadata = false, 
      AutomaticAuthenticate = true 
     }); 

Конфигурация сервера идентичности:

var cert = new X509Certificate2(Path.Combine(_contentRoot, "damienbodserver.pfx"), ""); 
     services.AddDeveloperIdentityServer() 
      .SetSigningCredential(cert) 
      .AddInMemoryScopes(Scopes.Get()) 
      .AddInMemoryClients(Clients.Get()) 
      .AddResourceOwnerValidator<ResourceOwnerPasswordValidator>() 
      .AddProfileService<ProfileService>(); 

     services.AddMvc(); 

Мой клиент:

public static IEnumerable<Client> Get() 
    { 
     return new[] 
     { 
      new Client() 
      { 
       ClientId = "myapi", 
       ClientSecrets = new List<Secret> 
       { 
        new Secret("secret".Sha256()) 
       }, 
       ClientName = "My Beautiful Api", 
       AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, 
       AllowAccessTokensViaBrowser = true, 
       RequireConsent = false, 
       AllowedScopes = { 
        "openid", 
        "api1" 
       }, 
       AllowedCorsOrigins = new List<string> { 
        "*" 
       }, 
       Enabled = true 
      } 
     }; 
    } 
} 

и область применения:

public static IEnumerable<Scope> Get() 
    { 
     return new List<Scope> 
     { 
      StandardScopes.OpenId, 
      StandardScopes.ProfileAlwaysInclude, 
      StandardScopes.EmailAlwaysInclude, 
      StandardScopes.OfflineAccess, 
      StandardScopes.RolesAlwaysInclude, 
      new Scope 
      { 
       Name = "api1", 
       DisplayName = "API 1", 
       Description = "API 1 features and data", 
       Type = ScopeType.Resource, 
       ScopeSecrets = new List<Secret> 
       { 
        new Secret("secret".Sha256()) 
       }, 
       Claims = new List<ScopeClaim> 
       { 
        new ScopeClaim("role") 
       } 
      } 
     }; 
    } 

Я попытался прочитать документацию, но мне кажется, что этого не хватает, поэтому мой вопрос первый:

Почему рольClaim существует только иногда?

И Второе:

Почему не Сервер идентификации реагирует с кодом 401 статуса, когда он не уполномочен и у меня есть [Авторизовать] на контроллере?

ответ

0

Если вы намерены использовать Service Fabric и Identity Server в качестве службы, вы можете столкнуться с проблемами, связанными с состоянием и хранением в памяти. Использование сервисной ткани обеспечит различные преимущества по сравнению с традиционными монолитными архитектурными подходами. Если вы еще этого не сделали, я бы постарался сосредоточиться на предоставлении безгражданности, действительно прочитал документацию вокруг JSON Web Tokens (JWT). Это позволит вам обеспечить проворное решение путем шифрования и дешифрования этого токена для предоставления или просмотра важной информации о пользователе/​​сроке действия.