Add a layer of authorization to your web services with Okta API Access Management.
Learning outcomesA copy of Visual Studio Community, Professional or Enterprise 2019 version 16.4 or later.
OverviewNote: Several standalone tools can send requests to APIs and allow you to inspect the responses. Our documentation uses Postman and offers Postman Collections to test its APIs more efficiently with a GUI. It also includes HTTP requests as text for those who prefer to use a terminal utility such as cURL (opens new window).
Background services and third-party APIs that access your APIs require the same levels of authentication and authorization (opens new window) as users who access your web apps. However, a machine-to-machine sign-in flow is silent and requires no user interaction. Use Okta to grant the correct level of access to your APIs on your behalf.
This quickstart contains the following tasks:
Tip: You need your Okta org domain to follow this tutorial. It looks like
integrator-123456.okta.com
. See Find your Okta domain. Where you see{yourOktaDomain}
in this guide, replace it with your Okta domain.
Check that API Access Management is enabledNote: For a similar use case where Okta secures a machine-to-machine sign-in flow between a background service app and the Okta APIs, rather than a service app and your own API, see Implement OAuth for Okta with a service app
API Access Management (API AM) is the feature in your org that allows Okta to secure your APIs. When enabled, API AM allows you to create an authorization server that establishes a security boundary for your APIs. All new developer orgs have API AM enabled by default, but itâs optional for production orgs. Check that itâs enabled in your org as follows:
If no Authorization Servers tab exists, API AM isnât enabled in your org. Contact your support team to enable this feature in your org or create an Okta Integrator Free Plan org (opens new window).
This tutorial uses the default custom authorization server to secure your API. Make a note of its name and audience value to configure your API:
api://default
.default
.Where you see {yourAudience}
and {yourAuthServerName}
in this guide, replace with api://default
and default
, respectively.
Note: You can either create a custom authorization server or use the default to protect your APIs. In either case, you need an appropriate license to use them in production. If you're using a custom authorization server other than
default
, you must use theid
of the authorization server rather than thename
.
For further information, see Authorization servers.
Create and configure a new web API to use OktaNow that you have an authorization server and noted how to identify it, complete the following steps:
Create an empty API project in Visual Studio with the ASP.NET Core Web API project template.
Alternatively, you can create a project with the .NET CLI:
Add the required packages to your projectThe Okta.AspNetCore (opens new window) library enables communication between Okta and your API. Install the latest version of Okta.AspNetCore (opens new window) in your project with the NuGet Package Manager:
Okta.AspNetCore
.Or, you can install the dependency with the .NET CLI:
Configure your API to use OktaNote: All Okta .NET libraries are hosted on NuGet (opens new window).
Earlier you noted your authorization server name and audience. Add these and your Okta domain to your API's configuration.
Open appsettings.json
and add the following as a top-level node, replacing the placeholders with your own values.
Note: If you're using a custom authorization server other than
default
, use the authorization serverid
in place of the{yourAuthServerName}
placeholder. For example,ausjs4mxguGY4DImf136
. See List all authorization servers (opens new window).
You must also configure your API to use Okta for authorization and authentication.
Open Startup.cs
and add the following using
statements at the top:
Replace the existing ConfigureServices
method with the following:
In the Configure
method, add the following line immediately above app.UseAuthorization();
:
Create two endpoints in your project that cover two different use cases:
api/whoami
âa protected endpoint (access-restricted API)api/hello
âan endpoint that anonymous users can access (unsecured API)Create an empty API controller named InfoController.cs
in the Controllers
folder.
Controllers
folder in Solution Explorer and select Add > Controller...InfoController.cs
, and then click Add.Add the following using
statements to the top of the file:
Replace the existing InfoController
class with the following code:
In many APIs, all endpoints require authorization. There may be a mix of protected and unprotected endpoints in others. These examples show you how to assign protected and unprotected access to an endpoint.
Require authorization for all endpointsAdd an authorization policy to the ConfigureServices
method in Startup.cs
to require authentication for all actions:
Configure access on a per-route basis to allow a mix of protected and anonymous endpoints.
Add the [Authorize]
and [AllowAnonymous]
attributes to the REST endpoints created earlier.
Enable Cross-Origin Resource Sharing (CORS) (opens new window) only if the API is being called from an app or API hosted on a different domain. For example, if your API is hosted on api.example.com
while your app is accessing it from example.com
, you must enable CORS.
Add CORS to the ConfigureServices
method in Startup.cs
:
Enable CORS in the Configure
method:
Add the CORS attribute to your API controller:
You can now test if your endpoint security works as intended. To do this, complete the following steps:
When another machine or service (rather than users) consumes an API, it uses the Client Credentials flow (opens new window) to identify itself and request an access token. Create an API services integration that has this flow enabled.
The configuration page for the new API services integration appears. Make a note of two values that you use to request your access token:
Moving on, where you see {yourClientId}
and {yourClientSecret}
in this guide, replace them with your client ID and client secret.
Scope is a way to limit an app's access to your API. An access token must include a list of the scopes an app integration can perform. Create a custom scope to query both endpoints for the API.
Now, start your server to get your API running.
There are two options:
dotnet run
in a terminal window.Leave your API running locally (or deployed if desired) and proceed to the next step.
Test with PostmanStart Postman if it's not open already. First, you request an access token from Okta and then check your APIs are protected correctly.
Request an access token for the APIMake an HTTP POST request to /token (opens new window) using the client ID and secret you noted earlier.
Select + in the Postman workbench to open a new request tab.
Select GET and change it to POST.
Enter https://{yourOktaDomain}/oauth2/{yourAuthServerName}/v1/token
for the URL.
Note: If you're using a custom authorization server other than
default
, use the authorization serverid
in place of the{yourAuthServerName}
placeholder.
In the Params tab, create two key-value pairs:
grant_type
, Value: client_credentials
scope
, Value: {yourCustomScope}
Select the Authorization tab, and then select Basic Auth for type.
Enter {yourClientId}
for Username and {yourClientSecret}
for Password.
Select the Headers tab and add two new headers:
Click Send to receive an access token.
Copy the value returned in the access_token
object field and use it for testing your API in the next section.
Now you can test your secured API endpoints. First, test the \whoami
endpoint, which requires authorization:
https://localhost:44336/api/whoami
200 OK
response.401 Unauthorized
response.Now test the hello endpoint that doesn't require authorization:
https://localhost:44336/api/hello
200 OK
response.200 OK
response.Learn more about the concepts introduced in this guide:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4