2017-04-06 2 views
2

私は、.NETアプリケーションでMartenというライブラリを介してpostgresデータベースを使用していますが、ユーザとそのロールの取得を管理するカスタムIUserLoginStoreがあります。これは正しく動作しているようですが、認証の設定に問題があります。ASP.NETコアのカスタムロールベースの承認(カスタムUser.IsInRole)?

var info = await _signInManager.GetExternalLoginInfoAsync(); 
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false); 

このアクションは、アクセス拒否問題スロー:

[HttpPost()] 
[Authorize(Roles = "Admin")] 
public JsonResult SubmitArticle([FromBody] ArticleInputModel input) {...} 

を私は認証コードに掘っていると、問題はそう、私はグーグルによる認証を使用していますし、それが正常に動作している

デフォルトのClaimsPrincipalコードにする:

public virtual bool IsInRole(string role) 
{ 
    return false; 
} 

ClaimsPrincipleの独自のバージョンを実装し、IsInRoleをオーバーライドする必要があります。どうすればこのアプリに戻ることができますか?

private static void ConfigureSecurity(IServiceCollection services) 
{ 
    services.AddIdentity<User, Role>() 
     .AddUserValidator<UserValidator>() 
     .AddUserStore<MartenUserStore>() 
     .AddRoleStore<MartenRoleStore>() 
     .AddDefaultTokenProviders(); 
} 
+0

は、応答を待っているだけでなくgithubの中でこのことについて投稿者:https://github.com/aspnet/Mvc/issues/6100 – Andrew

答えて

4

さてさて、私の場合はMartenRoleStoreが、それはまたGetRolesAsyncIsInRoleAsyncを有しているIUserRoleStoreを実装するために必要なIUserLoginStoreを実装して、掘り大量の後にそれを考え出しました。 (これは、それはあなたが.AddUserStore <のために使用される正確な同じクラスである必要があり、非常に重要である>();)

これは私が問題を引き起こしたことが判明コードです:

https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/UserManager.cs#L258

これは、それが動作するものである:

https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/UserClaimsPrincipalFactory.cs#L96

関連する問題