コントローラーを特定の役割のみに制限したいとします。具体的には、admin
としましょう。 admin
ロールを持つユーザーを設定した後、私は彼がIsInRoleAsync
メソッドを使用してその役割を果たしていることを検証できます(真を返します)。 [Authorize(Roles = "admin")]
で属性を設定すると、まったく同じユーザーで404が取得されます。私はベアラトークンを使用しています(これは関係ないと思いますが、とにかくです)、ここでデバッグを試みました。ASP.NET Core Identity 2.0 Authorize filter
コントローラなし[Authorize]
:リソースが返されます。 [Authorize]
で[OK]
コントローラー:でも役割のセットを持つユーザーでログインした後、私が手に:私は[Authorize(Roles = "admin")]
とAuthentication: Bearer [access token]
[OK]
コントローラーを使用のみときに、リソースが返されます
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 –
@ダニエルを取得します。あなたの2番目の問題の修正プログラムでアップデートされました。 – Pinpoint
あなたが述べたように、私の問題は、自分のトークンに「ロール」がないということでした。ユーザーにそのロールが割り当てられていれば、アイデンティティは「AspNetUserRoles」をチェックすると考えました。あなたの答えをありがとう –