Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
478 changes: 437 additions & 41 deletions .gitignore

Large diffs are not rendered by default.

14 changes: 6 additions & 8 deletions IdentityServer/IdentityServer.csproj
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="IdentityServer4" Version="2.1.3" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
<PackageReference Include="IdentityServer4" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.2"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.2"/>
</ItemGroup>

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
</ItemGroup>


</Project>
101 changes: 69 additions & 32 deletions IdentityServer/Startup.cs
Original file line number Diff line number Diff line change
@@ -1,54 +1,91 @@
using IdentityServer4.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;

namespace IdentityServer
{
{
public class Startup
{
private readonly IConfiguration _configuration;

public Startup(IConfiguration configuration)
{
Configuration = configuration;
_configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
#region Called for ASPNETCORE_ENVIRONMENT=Development
public void ConfigureDevelopmentServices(IServiceCollection services)
{
services.AddMvc();
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
options.SerializerSettings.Formatting = Formatting.Indented;
});

// Configuração do Identity Server In-Memory
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryClients(Config.GetClients())
services
.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
public void ConfigureDevelopment(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseIdentityServer();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
endpoints.MapControllerRoute(
"default", "{controller=Home}/{action=Index}/{id?}"
);
});
}
#endregion

#region Called for ASPNETCORE_ENVIRONMENT=Production
public void ConfigureProductionServices(IServiceCollection services)
{
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});

services
.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}

public void ConfigureProduction(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseExceptionHandler("/Home/Error");
app.UseIdentityServer();
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
app.UseExceptionHandler("/Home/Error");
}

//Habilitando o uso do Identity Server no nosso projeto
app.UseIdentityServer();

//Habilitando o uso de arquivos estáticos (Html, Css e etc) do nosso projeto
app.UseStaticFiles();

//Habilitando o uso de rota no projeto
app.UseMvcWithDefaultRoute();
endpoints.MapControllerRoute(
"default", "{controller=Home}/{action=Index}/{id?}"
);
});
}
#endregion
}
}
2 changes: 1 addition & 1 deletion IdentityServer/Views/Account/Login.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<h1>Login</h1>
</div>

@Html.Partial("_ValidationSummary")
<partial name="_ValidationSummary"/>

<div class="row">

Expand Down
6 changes: 3 additions & 3 deletions IdentityServer/Views/Consent/Index.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

<div class="row">
<div class="col-sm-8">
@Html.Partial("_ValidationSummary")
<partial name="_ValidationSummary"/>

<form asp-action="Index" class="consent-form">
<input type="hidden" asp-for="ReturnUrl" />
Expand All @@ -33,7 +33,7 @@
<ul class="list-group">
@foreach (var scope in Model.IdentityScopes)
{
@Html.Partial("_ScopeListItem", scope)
<partial name="_ScopeListItem"/>
}
</ul>
</div>
Expand All @@ -49,7 +49,7 @@
<ul class="list-group">
@foreach (var scope in Model.ResourceScopes)
{
@Html.Partial("_ScopeListItem", scope)
<partial name="_ScopeListItem"/>
}
</ul>
</div>
Expand Down
12 changes: 7 additions & 5 deletions IdentityServer/Views/Shared/Error.cshtml
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
@using Microsoft.AspNetCore.Hosting
@using Microsoft.Extensions.Hosting
@model ErrorViewModel
@inject IHostingEnvironment host

@inject IWebHostEnvironment Host

@{
var error = Model?.Error?.Error;
var errorDescription = host.IsDevelopment() ? Model?.Error?.ErrorDescription : null;
var request_id = Model?.Error?.RequestId;
var errorDescription = Host.IsDevelopment() ? Model?.Error?.ErrorDescription : null;
var requestId = Model?.Error?.RequestId;
}

<div class="error-page">
Expand Down Expand Up @@ -33,9 +35,9 @@
}
</div>

@if (request_id != null)
@if (requestId != null)
{
<div class="request-id">Request Id: @request_id</div>
<div class="request-id">Request Id: @requestId</div>
}
</div>
</div>
Expand Down
126 changes: 85 additions & 41 deletions iMastersApp/Startup.cs
Original file line number Diff line number Diff line change
@@ -1,75 +1,119 @@
using System.IdentityModel.Tokens.Jwt;
using IdentityServer4;
using System.IdentityModel.Tokens.Jwt;
using IdentityServer4;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;

namespace iMastersApp
{
{
public class Startup
{
private readonly IConfiguration _configuration;

public Startup(IConfiguration configuration)
{
Configuration = configuration;
_configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
private static void ConfigureIdentityServerOnClient(IServiceCollection services)
{
services.AddMvc();

//Exibe as claims de maneira mais "amigável"
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

//Adciona o serviço de autenticação
services.AddAuthentication(options =>
{
//Nosso esquema default será baseado em cookie
options.DefaultScheme = "Cookies";

//Como precisamos recuperar os dados depois do login, utilizamos o OpenID Connect que por padrão utiliza o escopo do Profile
options.DefaultChallengeScheme = "oidc";
})
services
.AddAuthentication(options =>
{
//Nosso esquema default será baseado em cookie
options.DefaultScheme = "Cookies";
//Como precisamos recuperar os dados depois do login, utilizamos o OpenID Connect que por padrão utiliza o escopo do Profile
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
//Aponta para o nosso servidor de autenticação
options.Authority = "http://localhost:5000";
options.Authority = "http://localhost:32182";
options.RequireHttpsMetadata = false;
//Nome da nossa aplicação que tentará se autenticar no nosso servidor de identidade
//Nome da nossa aplicação que tentará se autenticar no nosso servidor de identidade
//Observe que ela possui o mesmo nome da app que liberamos no nosso servidor de identidade
options.ClientId = "iMastersApp";
options.SaveTokens = true;
//Adicionamos o scopo do e-mail para utilizarmos a claim de e-mail.
options.Scope.Add(IdentityServerConstants.StandardScopes.Email);

options.SaveTokens = true;
//Adicionamos o scopo do e-mail para utilizarmos a claim de e-mail.
options.Scope.Add(IdentityServerConstants.StandardScopes.Email);
options.Scope.Add("custom.profile");
});
}

#region Called for ASPNETCORE_ENVIRONMENT=Development
public void ConfigureDevelopmentServices(IServiceCollection services)
{
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
options.SerializerSettings.Formatting = Formatting.Indented;
});

ConfigureIdentityServerOnClient(services);
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
public void ConfigureDevelopment(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
app.UseDeveloperExceptionPage();
}
endpoints.MapControllerRoute(
"default", "{controller=Home}/{action=Index}/{id?}"
);
});
}
#endregion

//Habilitando o uso da autenticação do Identity Server no nosso projeto
app.UseAuthentication();

//Habilitando o uso de arquivos estáticos (Html, Css e etc) do nosso projeto
app.UseStaticFiles();

//Habilitando o uso de rota no projeto
app.UseMvcWithDefaultRoute();
#region Called for ASPNETCORE_ENVIRONMENT=Production
public void ConfigureProductionServices(IServiceCollection services)
{
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});

ConfigureIdentityServerOnClient(services);
}

public void ConfigureProduction(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseExceptionHandler("/Home/Error");
app.UseAuthentication();
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
"default", "{controller=Home}/{action=Index}/{id?}"
);
});
}
#endregion
}
}
Loading