#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() ?