Сервер идентификации, ASP.NET Ядро и веб-API

#c# #owin #identityserver4 #bearer-token #owin-middleware

#c# #owin #identityserver4 #токен на предъявителя #owin-промежуточное программное обеспечение

Вопрос:

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

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

Теперь я полностью запутался в том, как заставить ВЕБ-API сначала распознавать токены-носители, а затем предоставить мне некоторую авторизацию для доступа к конечным точкам веб-api.

это мой сервер идентификации 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 Основные вызовы сервера идентификации и веб-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").Resu<
        }

        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().Resu<
                return auth;
            }
            catch (Exception ex)
            {
                return ex.Message;

            }
        }  
    }
  

Итак, кто-нибудь может объяснить или поделиться некоторыми ссылками на то, что я должен сделать, чтобы заставить ВЕБ-API (с промежуточным программным обеспечением owin) обрабатывать вызовы из ASP.NET Основной клиент? Какие настройки я должен указать в методе конфигурации Owin (приложение IAppBuilder).

Ответ №1:

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

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

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

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

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

 app.UseResourceAuthorization(new AuthorizationManager());
  

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

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

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

Комментарии:

1. Спасибо, наконец-то немного сдвинулся с того места, где я застрял

2. В каком пространстве имен и пакете NuGet вы нашли метод UseResourceAuthorization() ?