2016-10-05 15 views
0

Я установил IdentityServer4 и другое приложение для приложения ASP.NET Core. Клиент должен пройти аутентификацию с помощью IdentityServer и запросить доступ к третьему приложению, которое является стандартным проектом MVC Web API.IdentityServer, API-интерфейс ASP.NET и веб-интерфейс

я следовал шаги для достижения учетных данных клиента потока из этого примера https://identityserver.github.io/Documentation/docsv2/overview/simplestOAuth.html

Теперь я полностью потерял о том, как получить WEB API сначала распознавать маркеры на предъявителя, а затем дать мне разрешение на доступ к web api конечные точки.

это мой IdentityServer Statrup.cs

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddIdentityServer() 
       .AddInMemoryStores() 
       .AddInMemoryClients(Config.GetClients()) 
       .AddInMemoryScopes(Config.GetScopes());   
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(LogLevel.Debug); 
     app.UseDeveloperExceptionPage(); 

     app.UseIdentityServer(); 
    } 
} 

и Config.cs

public class Config 
{ 
    // scopes define the resources in your system 
    public static IEnumerable<Scope> GetScopes() 
    { 
     return new List<Scope> 
     { 
      new Scope 
      { 
       Name = "api1" 
      } 
     }; 
    } 

    // clients want to access resources (aka scopes) 
    public static IEnumerable<Client> GetClients() 
    { 
     // client credentials client 
     return new List<Client> 
     { 
      // no human involved 
     new Client 
     { 
      ClientName = "Silicon-only Client", 
      ClientId = "silicon", 
      Enabled = true, 
      AccessTokenType = AccessTokenType.Reference, 

      AllowedGrantTypes = GrantTypes.ClientCredentials, 

      ClientSecrets = new List<Secret> 
      { 
       new Secret("F621F470-9731-4A25-80EF-67A6F7C5F4B8".Sha256()) 
      }, 

      AllowedScopes = new List<string> 
      { 
       "api1" 
      } 
     } 
     }; 
    }} 

ASP.NET Основные вызовы к IdentityServer и Web API

[Route("api/testing")] 
    public class TestingController : Controller 
    { 
     // GET: api/values 

     [HttpGet] 
     public IActionResult Get() 
     { 
      var responce = GetClientToken(); 

      return Json(new 
      { 
       message = CallApi(responce) 
      }); 
     } 

     static TokenResponse GetClientToken() 
     { 
      var client = new TokenClient(
       Constants.TokenEndpoint, 
       "silicon", 
       "F621F470-9731-4A25-80EF-67A6F7C5F4B8"); 

      return client.RequestClientCredentialsAsync("api1").Result; 
     } 

     static string CallApi(TokenResponse response) 
     { 
      var client = new HttpClient 
      { 
       BaseAddress = new Uri(Constants.AspNetWebApiSampleApi), 
       Timeout = TimeSpan.FromSeconds(10) 
      }; 
      client.SetBearerToken(response.AccessToken); 
      try 
      {     
       var auth = client.GetStringAsync().Result; 
       return auth; 
      } 
      catch (Exception ex) 
      { 
       return ex.Message; 

      } 
     } 
    } 

Так может кто-нибудь объяснит или поделится некоторыми ссылками о том, что я должен сделать, чтобы получить WEB APi (с промежуточным программным обеспечением owin) для обработки вызовов от клиента ASP.NET Core? Какую настройку я должен установить в приложении Owin Configuration (IAppBuilder app).

ответ

1

Прежде всего, вы должны добавить ScopeType в свой api-scope, , поскольку ваш API обрабатывает ресурсы, необходимые для добавления ScopeType.Resource, если вы хотите показать экран согласия на вашем MVC-клиенте, вы также должны добавить отображаемое имя, и если вам нужны дальнейшие претензии на свой апи, добавьте их в списке претензий:

new Scope 
{ 
    Name = "api", 
    DisplayName = "Your scopes display name", 
    Type = ScopeType.Resource, 
    Claims = new List<ScopeClaim> 
    { 
     new ScopeClaim("role") 
    } 
} 

в вашем апи-проекте вы также должны добавить класс OwinStartup потому что то, где вы скажите ваш API для авторизация на предъявителя на предъявителя: В конфигурации пуска:

app.UseIdentityServerBearerTokenAuthentication(
    new IdentityServerBearerTokenAuthenticationOptions 
    { 
     Authority = "YourIdentityServersAddress.com/identity", 
     RequiredScopes = new[] { "api" }, 
    }); 
app.UseWebApi(WebApiConfig.Register()); 

Последняя строка предназначена только для регистрации вашего webapi-config. Thats, где вы указываете свой авторитет, то есть (это означает) ваш Identity-Server и область действия, указанную в Startup-файле IdentityServers. Если вы хотите добавить заказ AuthorizationManager (например, для авторизации для определенных ролей, которые необходимо добавить следующую строку перед «UseIdentityServerBearer ...» в запуске вашего API:

app.UseResourceAuthorization(new AuthorizationManager()); 

Где AuthorizationManager является класс, который вы реализуете ваш собственный путем наследования от класса ResourceAuthorizationManager. Но я не хочу, чтобы добраться до глубоко на это (если у вас есть дополнительные вопросы по этому поводу я буду счастлив пойти глубже)

И на контроллере API вам просто нужно добавить [Авторизовать] Атрибут выше методов, которые вы не должны иметь авторизованный доступ на уровне класса или на уровне, если требуется, чтобы весь ваш контроллер был разрешен. (Если вы хотите использовать, например, аутентификации ролей вы нуждаетесь в [ResourceAuthorize].

Если у вас есть дополнительные вопросы или вы хотите знать, не стесняйтесь спросить

+0

Спасибо, наконец, переехал немного от того, где я был застрял – zdrsh