2017-01-02 5 views
4

С Новым годом для всех ...IdentityServer4 IdentityServer3.AccessTokenValidation

Я настроил IdentityServer4, и я могу сделать успешную ASP.net Ключевых Web API вызовов. Но для asp.net framework 4.5.2 web apis, Я получил {«Код состояния ответа не указывает на успех: ошибка 401 (неавторизованная)."} Из .NET framework web api. Я хочу спросить вашу помощь и мнение.

Я прочитал тему с IS4 и нашел несколько записей о совместимости IdentityServer3.AccessTokenValidation. И в соответствии с ответами я загрузил сертификат подписи и назвал AddSigningCredential вместо AddTemporarySigninCredential. x509certificate - это локальный созданный сертификат. и я обновил версию IdentityServer3.AccessTokenValidation до версии 2.2.

Еще я получил ошибку. Любая помощь приветствуется.

С уважением и благодарностью за ваши большие усилия.

IdentityServer 4 сторона: Startup.cs

public void ConfigureServices(IServiceCollection services) 
     { 
       services 
       .AddIdentityServer()     
       //.AddTemporarySigningCredential() 
       .AddSigningCredential(x509Certificate) 
       .AddInMemoryIdentityResources(Config.GetIdentityResources()) 
       .AddInMemoryApiResources(Config.GetApiResources()) 
       .AddInMemoryClients(Config.GetClients()) 
       .AddAspNetIdentity<ApplicationUser>(); 
} 

Config.cs

public static IEnumerable<ApiResource> GetApiResources() 
      { 
       return new List<ApiResource> 
       { 
        new ApiResource("AuthorizationWebApi","Authorization Web API .NET Core"), 
        new ApiResource("AuthorizationWebApiNetFramework","Authorization Web API NET Framework"), 
       new ApiResource("api1", "Empty Test Api") 
       }; 

      } 

     public static IEnumerable<Client> GetClients() 
     { 
      return new List<Client> { 
new Client { 
        ClientId = "silicon", 
        ClientName = "console app", 
        AllowedGrantTypes = GrantTypes.ClientCredentials, 
        ClientSecrets = { new Secret("abcdef".Sha256())}, 
        AllowedScopes = new List<string>{ 
        "AuthorizationWebApiNetFramework" 
        } 

       }, 
       new Client 
       { 
        ClientId = "MYUX", 
        ClientName = "MYUX MVC Client", 
        AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, 
        RequireConsent = false, 
        ClientSecrets= {new Secret("abcdef".Sha256()) }, 
        RedirectUris = { "http://localhost:5002/signin-oidc" }, 
        PostLogoutRedirectUris = {"http://localhost:5002"}, 

        AllowedScopes = { 
         IdentityServerConstants.StandardScopes.OpenId, 
         IdentityServerConstants.StandardScopes.Profile,       
         "custom.profile", 
         "AuthorizationWebApi", 
         "AuthorizationWebApiNetFramework" 
        }, 
        AllowOfflineAccess = true 
       } 
      }; 
     } 

.NET Framework Api Side

public void Configuration(IAppBuilder app) 
     { 
      //ConfigureAuth(app); 
      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
      app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
      { 
       Authority = "http://www.abcdefgh.com:5000", 
       ValidationMode = ValidationMode.ValidationEndpoint, 
       RequiredScopes = new[] { "AuthorizationWebApiNETFramework" } 

      }); 
      //configure web api 
      var config = new HttpConfiguration(); 
      config.MapHttpAttributeRoutes(); 

      //require authentication for all controllers 

      config.Filters.Add(new AuthorizeAttribute()); 

      app.UseWebApi(config); 
     } 

Calling сторона:

try 
      { 
       ViewData["Message"] = "Authorization Test."; 
       var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token"); 
       var authorizationApiClient = new HttpClient(); 
       authorizationApiClient.SetBearerToken(accessToken); 
       var content = await authorizationApiClient.GetStringAsync("http://localhost:13243/values"); 
       return View(); 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 

или консольного приложения ...

try 
{ 
    // discover endpoints from metadata 
    var disco = await DiscoveryClient.GetAsync("http://www.abcdefgh.com:5000"); 

    var tokenClient = new TokenClient(disco.TokenEndpoint, "silicon", "abcdef"); 
    var tokenResponse = await tokenClient.RequestClientCredentialsAsync("AuthorizationWebApiNetFramework"); 

    if (tokenResponse.IsError) 
    { 
     Console.WriteLine(tokenResponse.Error); 
     return; 
    } 

    Console.WriteLine(tokenResponse.Json); 

    var client = new HttpClient(); 
    client.SetBearerToken(tokenResponse.AccessToken); 

    var response = await client.GetAsync("http://localhost:13243/values"); 
    if (!response.IsSuccessStatusCode) 
    { 
     Console.WriteLine(response.StatusCode); 
    } 
    else 
    { 
     var content = await response.Content.ReadAsStringAsync(); 
     Console.WriteLine(JArray.Parse(content)); 
    } 
} 
catch (Exception) 
{ 
    throw; 
}  

EDIT: На 4.5.2 Api стороне: Я закомментирована линии ValidationMode = ValidationMode.ValidationEndpoint. Я добавил эту строку, следуя документации IS3. Всем спасибо.

+0

Я бы предложил, начиная с образцов и подтвердить, что они работают. Затем из образцов начните сравнивать различия в ваших пользовательских проектах. –

+0

Что говорит журнал idsrv4 во время получения ошибки 401. –

+0

Спасибо, ребята, @BrockAllen, поскольку я сказал, что могу аутентифицировать ASP.Net Core MVC с открытым подключением id и аутентифицировать ASP.Net Core WebApi с учетными данными клиента с моим ASP.NET Core IS4. Но у меня проблема с 4.5.2 ApiResource. Jonas Axelsson Я вижу, что токен сгенерирован успешно, но поскольку я ничего не помню, когда я вызываю GetAsync из WebApi. Я проверю это сегодня :). привет – ozgurozkanakdemirci

ответ

3

Удалите следующую строку в промежуточном программном обеспечении для проверки подлинности WebAPI accesstoken.

ValidationMode = ValidationMode.ValidationEndpoint 

Результат должен выглядеть следующим образом:

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
{ 
    Authority = "http://www.abcdefgh.com:5000", 
    RequiredScopes = new[] { "AuthorizationWebApiNETFramework" } 
}); 
Смежные вопросы