Authenticated REST API for a mobile app and websit

2019-09-05 02:24发布

问题:

I have a pretty much boilerplate "ASP.NET Core Web Application (.NET Framework)" application, that should become a REST API, to be hosted on Azure, for use for a website & mobile app.

I want to equip it with token authentication through the headers, and I have chosen for the OpenIdConnect package.

I have copypasted the snippets from this page (https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server) into my template, and added the app.UseOAuthValidation() call, so the code looks like this:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddAuthentication();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseOAuthValidation();

    app.UseOpenIdConnectServer(options =>
        {
              //..... Copy-paste from the OpenIdConnect page

              OnValidateTokenRequest = context => { ... }
              OnHandleTokenRequest = context => { ... }
        });

    app.UseMvc();
}

I am able to get a token (POST to /connect/token).

If I add an [Authorize] to my ValuesController to GET and set the Authorization header with the token but I keep on getting a 401 Unauthorized. The code doesn't even break into the OnValidateTokenRequest or OnHandleTokenRequest methods.

What am I missing?

回答1:

You are doing it kind of wrong.

Let me explain shortly. Your REST API will not be the OpenIDConnect server. It should just authenticate a token given to it.

This article looks pretty good: https://contos.io/protecting-a-net-core-api-with-azure-active-directory-59bbcd5b3429#.1w8djbaci This example uses Azure AD, but since you are hosting on Azure, I assume that would be a good option for you.

In short, you need something like this in your API:

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    Authority = Configuration[“Authentication:AzureAd:AADInstance”] 
    + Configuration[“Authentication:AzureAd:TenantId”], 
    Audience = Configuration[“Authentication:AzureAD:ClientId”], 
    TokenValidationParameters = 
    new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
      {
        ValidIssuer = 
        Configuration [“Authentication:AzureAd:AADInstance”] 
      + Configuration[“Authentication:AzureAd:TenantId”] + “/v2.0” }
});