2017-07-12 5 views
0

Also habe ich derzeit IdentityServer 4 in einer .Net-Core-Anwendung mit JWT Bearer Token für die Authentifizierung implementiert.Asp.Net Core Identity mit AuthorizeAttribute funktioniert nicht für Rollen

Das Problem scheint zu sein, wenn [Authorize(Roles = "Admin")] mit erhalte ich die folgende aus den Protokollen: [Information] AuthenticationScheme: "Bearer" was forbidden.

Wenn ich nur die [Authorize] Attribut es funktioniert gut. Hier

ist der Code:

services.AddDbContext<OmbiContext>(options => 
    options.UseSqlite("Data Source=Ombi.db")); 

services.AddIdentity<OmbiUser, IdentityRole>() 
    .AddEntityFrameworkStores<OmbiContext>() 
    .AddDefaultTokenProviders(); 

services.AddIdentityServer() 
    .AddTemporarySigningCredential() 
    .AddInMemoryPersistedGrants() 
    .AddInMemoryIdentityResources(IdentityConfig.GetIdentityResources()) 
    .AddInMemoryApiResources(IdentityConfig.GetApiResources()) 
    .AddInMemoryClients(IdentityConfig.GetClients()) 
    .AddAspNetIdentity<OmbiUser>(); 

services.Configure<IdentityOptions>(options => 
{ 
    options.Password.RequireDigit = false; 
    options.Password.RequiredLength = 1; 
    options.Password.RequireLowercase = false; 
    options.Password.RequireNonAlphanumeric = false; 
    options.Password.RequireUppercase = false; 
}); 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IMemoryCache cache) 
{ 
    app.UseIdentity(); 
    app.UseIdentityServer(); 
    app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
    { 
     Authority = options.Value.WebsiteUrl, 
     ApiName = "api", 
     ApiSecret = "secret", 

     EnableCaching = true, 
     CacheDuration = TimeSpan.FromMinutes(10), // that's the default 
     RequireHttpsMetadata = options.Value.UseHttps, // FOR DEV set to false 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true  
    }); 
// etc... 
} 

-Code den Benutzer und die Rolle zu erstellen:

var result = await UserManager.CreateAsync(userToCreate, user.Password); 
if (result.Succeeded) 
{ 
    if (!(await RoleManager.RoleExistsAsync("Admin"))) 
    { 
     var r = await RoleManager.CreateAsync(new IdentityRole("Admin")); 
    } 
    var re = await UserManager.AddToRoleAsync(userToCreate, "Admin"); 
} 

der Suche in der Datenbank alles richtig verbunden und ich kann sehen, dass, dass Benutzer das hat korrekte Rolle, aber das Autorize-Attribut funktioniert immer noch nicht.

EDIT

Nach etwas mehr Untersuchung, an der User Eigenschaft auf dem Controller suchen, wenn wir die [Authorize] haben hier Attribut ist das Ergebnis: enter image description here

So scheint es, dass wir nicht einmal tun Holen Sie sich den Benutzernamen oder etwas über den Benutzer.

Antwort

0

Ich glaube, Sie könnten UseJwtBearerAuthentication innerhalb Ihrer Configuration Methode fehlen.

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     // You can set different kind of validations here. 
     // ValidateIssuerSigningKey, ValidateAudience, ValidateIssuer, etc. 
    } 
}); 
+0

wissen Auch es funktioniert, wenn 'mit [Genehmigtes]' nur nicht, wenn ich liefern eine Rolle? –

+0

Betrachtet man den Code in 'UseIdentityServerAuthentication', ruft er' UseJwtBearerAuthentication' auf –

0

im Bild Suchen Sie zur Verfügung gestellt haben, sieht aus wie Sie 20 Ansprüche in Ihrem Anspruch Liste. Versuchen Sie zu sehen, welche Rollen/Ansprüche Sie in dieser Liste sehen!

können Sie die Liste erhalten, indem

var claims = HttpContext.User.Claims.ToList(); 

foreach (var c in claims) 
{ 
    Console.WriteLine(c.Type + c.Value); 
} 
Verwandte Themen