Я знаю, что есть похожие вопросы, но все же это не очень понятно,
Прочитав кучу постов, связанных с темой, вот как я «понял» код должен выглядеть, я все еще имею дело со всеми концепциями, касающимися oauth / openid / owin / katana / identityserver и т. д. ...
Большая картина: у меня угловое приложение,
там, где пользователь регистрируется и входит в систему, согласия не требуется, как только пользователь вошел в систему, SPA начнет соединяться со всеми API-интерфейсами сзади, и API-интерфейсы должны иметь возможность аутентификации на сервере аутентификации.
Таким образом, мне нужно, чтобы мой веб-интерфейс API мог проходить проверку подлинности на сервере идентификации 4 через тип предоставления учетных данных клиента с выданным токеном сервером проверки подлинности.
Я получил этот клиент (web api 2 .net framework 4.5), определенный в identiy server 4:
public static IEnumerable<Client> GetClients()
{
//client credentials client
return new List<Client>
{
new Client
{ ClientId = "client2",
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes = { "api2" }
},
}
На стороне .net Api у меня есть это:
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType =
CookieAuthenticationDefaults.AuthenticationType
});
app.UseOpenIdConnectAuthentication(new
OpenIdConnectAuthenticationOptions
{
ClientId = "client2",
Authority = "http://localhost:5000",
RequireHttpsMetadata = false,
ResponseType = "id_token",
Scope = "api2",
SignInAsAuthenticationType =
CookieAuthenticationDefaults.AuthenticationType,
}
});
А контроллеры украшены декоратором Autorize.
Это версии пакетов, которые я использую
id="Microsoft.Owin.Security.OpenIdConnect" version="4.0.0"
id="Microsoft.Owin.Security.OAuth" version="4.0.0"
id="Microsoft.Owin.Security" version="4.0.0"
id="Microsoft.Owin" version="4.0.0"
К тому моменту, когда я использую один из демонстрационных проектов с официального сайта проекта (https://github.com/IdentityServer/IdentityServer4.Samples), я добавил дополнительный вызов в демонстрационном приложении MVC для вызова моего API.
public async Task<IActionResult> CallApiUsingUserAccessToken2()
{
var accessToken = await HttpContext.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await
client.GetStringAsync("http://localhost:17307/api
/Organization/GetOrganizationById/2007");
ViewBag.Json = JArray.Parse(content).ToString();
return View("Json");
}
Согласно рабочей демонстрации, есть два способа сделать это, но ни один из них мне не помог.
public async Task<IActionResult> CallApiUsingClientCredentials2()
{
var tokenClient = new TokenClient("http://localhost:5000/connect/token", "mvc", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken);
var content = await client.GetStringAsync("http://localhost:17307/api/Organization/GetOrganizationById/2007");
ViewBag.Json = JArray.Parse(content).ToString();
return View("Json");
}
Это часть ответа с ошибкой, я получаю в обоих сценариях:
<div class="row">
<div class="col-sm-6">
<div class="alert alert-danger">
Sorry, there was an error
<strong>
<em>
: invalid_request
</em>
</strong>
<div>Invalid redirect_uri</div>
</div>
<div class="request-id">Request Id: 0HLIALF7L4N8J:00000001</div>
</div>
</div>
Чего здесь не хватает или что не так, является ли redirect_uri обязательным, почему его нет в разделе конфигурации для ядра .net?
Вот так выглядит конфигурация API в ядре .net и работает нормально.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
}
Заранее спасибо.
Обновление
После некоторых экспериментов я подтверждаю, что у меня возникла проблема в API, проверяющем токен доступа с использованием промежуточного программного обеспечения owin.
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
});
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string,
string>
();
app.UseIdentityServerBearerTokenAuthentication
(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "http://localhost:5000",
RequiredScopes = new[] { "api2" },
});
}
Я использую identityserver3.accesstokenvalidation для выполнения проверки, как это рекомендуется, но после получения токена доступа в клиентском приложении и передачи его в запрос API, я получаю 401 несанкционированную ошибку, это потому, что это ожидая работать по защищенному HTTPS ?, я замечаю, что для accesstokenvalidation v4 вы можете установить «RequireHttpsMetadata = false», но я не вижу этого в v3, может быть поэтому я не получаю токен для проверки?