我有一個控制器,我只想限制到一個特定的角色,比如說admin
。在爲admin
角色設置用戶後,我可以使用IsInRoleAsync
方法(它返回true)驗證他是否在該角色上。當使用[Authorize(Roles = "admin")]
設置屬性時,我得到了一個與該用戶完全相同的404。我使用持票人令牌(我認爲這不是相關的,但無論如何),這裏是我已經做的嘗試調試:ASP.NET Core Identity 2.0授權過濾器
控制器w/o [Authorize]
:資源被返回。 [OK]
控制器與[Authorize]
:即使有作用組中的用戶登錄後,我得到了:當我使用Authentication: Bearer [access token]
[OK]
控制器與[Authorize(Roles = "admin")]
資源只返回 404 [NOK]
我不知道如果我錯過了一些配置,但這裏是我的ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
options.UseOpenIddict();
});
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddOpenIddict(opt =>
{
opt.AddEntityFrameworkCoreStores<ApplicationDbContext>();
opt.AddMvcBinders();
opt.EnableTokenEndpoint("/api/token");
opt.AllowPasswordFlow();
opt.DisableHttpsRequirement(); //for dev only!
opt.UseJsonWebTokens();
opt.AddEphemeralSigningKey();
opt.AllowRefreshTokenFlow();
opt.SetAccessTokenLifetime(TimeSpan.FromMinutes(5));
});
services.AddAuthentication(options =>
{
options.DefaultScheme = OAuthValidationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = OAuthValidationConstants.Schemes.Bearer;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddJwtBearer(options =>
{
options.Authority = "http://localhost:44337/";
options.Audience = "resource_server";
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = OpenIdConnectConstants.Claims.Subject,
RoleClaimType = OpenIdConnectConstants.Claims.Role
};
});
services.Configure<IdentityOptions>(options =>
{
// Password settings
options.Password.RequireDigit = true;
options.Password.RequiredLength = 8;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = true;
options.Password.RequireLowercase = false;
// Lockout settings
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
options.Lockout.MaxFailedAccessAttempts = 10;
// User settings
options.User.RequireUniqueEmail = true;
// Add application services.
options.ClaimsIdentity.UserNameClaimType= OpenIdConnectConstants.Claims.Name;
options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject;
options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;
});
services.AddSingleton(typeof(RoleManager<ApplicationUser>));
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
那麼,這解釋並解決了404,但是,爲什麼我無法訪問內容,因爲我的用戶具有所需的角色?現在我得到一個403 –
@DanielS。答案更新爲您的第二個問題的修復。 – Pinpoint
正如你所說的,我的問題是我的代幣沒有「角色」,因爲我認爲如果用戶分配了該角色,身份將檢查「AspNetUserRoles」。謝謝您的回答 –