Аутентификация WEB API 2 .net framework 4.x на сервере идентификации 4 с использованием OIDC - PullRequest
0 голосов
/ 15 ноября 2018

Я знаю, что есть похожие вопросы, но все же это не очень понятно, Прочитав кучу постов, связанных с темой, вот как я «понял» код должен выглядеть, я все еще имею дело со всеми концепциями, касающимися 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, может быть поэтому я не получаю токен для проверки?

1 Ответ

0 голосов
/ 16 ноября 2018

Попробуйте сначала ввести правильный client_id в этой строке от "mvc" до "client2"

var tokenClient = new TokenClient ("http://localhost:5000/connect/token", " mvc"," секрет ");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...