2017-01-16 5 views
5

IdentityServer4が存在し、認証に関して多くの点でより簡単に人生を送ることができて非常にうれしいですが、私は問題と多くの議論を見つけました。コミュニティ内の主張に役割を追加する。ASP.netアイデンティティーロールをIdentityServer4 IDトークンに組み込む方法

私の要件は単純です:

  1. 私は、ユーザーの身元を格納するためのシステム(名称、PWD、役割、携帯電話を必要とする認証および承認
  2. を必要とするアプリケーション(xamarinフォーム)を開発... ) - > ASP.netアイデンティティが
  3. が、私は私のユーザーを認証するシステムが必要 - > IdentityServerユーザーあたり4つの
  4. 役割は非常に(ユーザー/ admin)を制限していると私はAPIのバックエンドを必要とする
  5. を変更しないと〜私はに異なる設定をしようと数え切れないほどの時間を費やしてきた私は、[承認(役割は= "管理者")を]を使用して、いくつかのAPI/MVCコントローラ

へのアクセスを制限したいMVCのadminサイト(asp.netコア)

  • get asp.net認証後に運がないMVCアプリケーションに渡すアイデンティティロール。目的は、ポイント6で説明したとおりです。

    私はまた、読んで何十時間も費やしましたが、実装に関するIdentityServer4.AspIdentityのバージョンがバージョンv1.0.0以降に大きく変わったと感じています。

    これについて多くのことを読んだ後、2ヶ月前に説明された解決策のいくつかはもはや有効ではないように見えるため、これを実際にどのように実装するかは不明です。唯一 アイデンティティトークンを要求し、AlwaysIncludeInIdTokenを使用して、IDトークンへの

    1. 役割:

      だから、今の私は2つのパスがあると考えていますか?

    2. クライアントにuserinfoエンドポイントを使用して ロールを取得させ、何らかの理由で[承認(Roles = "Admin")]を使用してチェックするためにhttpcontext(?)にmvcを注入しますか?

    とにかく、これは私の前提です。

    私たちはこれを永続的な方法で実装することができるように、手助けして説明してください。いくつかの実行可能な例も素晴らしいでしょう。

  • +0

    を使用すると、役割が存在することを確認することができますトークンで?彼らがそうするなら、あなたの痛みの原因を知るかもしれません。 – Lutando

    +0

    いいえ、私はいかなる主張(ロール、カスタムクレーム...)も追加できませんでした。だから私は多くを研究し、以下に述べる2つの解決策を見つけました。私は、Identity Serverレベルとクライアントレベルの両方でクレームを追加できるようになりました。もちろん、これをより良くするための提案はいつでも歓迎します。 – Laobu

    答えて

    6

    ので、調査の後、私はこれを行うには2つの方法を作ってみた:

    1. は、Identity Serverのサイド
    2. 上の役割/その他の請求は、クライアント側
    3. の役割/その他の請求をインクルード

    はラヴィpunjwaniがadditiを追加する方法」に答えを提供

    Identity Serverのサイドに含めますASP.Net IdentityとIdentityServer4を使用してaccess_tokenに含まれることを約束します。彼の解決策は依然としてドラフトにありますが、トークンがクライアントに返送される前に、解決策を使用してクレームを追加することができます。それは、クライアントの要求パイプラインで「IClaimsTransformer」を加えることを含むよう

    この1つは少し厳しいです

    How to add additional claims to be included in the access_token using ASP.Net Identity with IdentityServer4を含めるクライアント側:これはリンクです。その結果、要求ごとにClaimstransformerはユーザーのクレームを取得し、ユーザーIDクレーム(トークン)に追加します。 Claimstransformerのセットアップは、DIを動作させるのは難しいので簡単ではありませんが、多くの研究の後に、セローのソリューションが私にとってそれを行います。

    カスタムClaimsTransformerクラスんミドルウェアでの変換: パブリッククラスKarekeClaimsTransformer:IClaimsTransformer { プライベート読み取り専用のUserManager _userManager。 ConfigureServicesで

    あなたがスコープに追加する必要があり、クライアント起動クラスで
    public KarekeClaimsTransformer(UserManager<ApplicationUser> userManager) 
        { 
         _userManager = userManager; 
        } 
    
        public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
        { 
         if (context.Principal.Identity.IsAuthenticated) 
         { 
          Claim userId = context.Principal.FindFirst("sub"); 
    
          if (context.Principal.FindFirst("role") == null && userId != null) 
          { 
           ApplicationUser user = await _userManager.FindByIdAsync(userId.Value); 
           var roles = await _userManager.GetRolesAsync(user); 
           foreach (var role in roles) 
           { 
            ((ClaimsIdentity)context.Principal.Identity).AddClaim(new Claim(JwtClaimTypes.Role, role, 
             "http://schemas.microsoft.com/ws/2008/06/identity/claims/role")); 
           } 
          } 
         } 
         return Task.FromResult(context.Principal).Result; 
        } 
    } 
    

    public void ConfigureServices(IServiceCollection services) 
        { 
         // Add framework services. 
         services.AddDbContext<ApplicationDbContext>(options => 
          options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
    
         ... 
         services.AddScoped<IClaimsTransformer, KarekeClaimsTransformer>(); 
         // Add framework services. 
         services.AddMvc(); 
        } 
    

    最後に、設定に追加します。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
        { 
         loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
         loggerFactory.AddDebug(); 
    
         app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
         { 
          Authority = "http://localhost:5000", 
          RequireHttpsMetadata = false, 
    
          ApiName = "api1" 
         }); 
    
         app.UseClaimsTransformation((context) => 
         { 
          IClaimsTransformer transformer = context.Context.RequestServices.GetRequiredService<IClaimsTransformer>(); 
          return transformer.TransformAsync(context); 
         }); 
    
         app.UseMvc(routes => 
         { 
          routes.MapRoute(
           name: "default", 
           template: "api/{controller}/{action?}/{id?}"); 
         }); 
        } 
    
    関連する問題