2017-01-13 20 views
0

私は、サービスを介してユーザーを認証する必要があるWebサイトで作業しています。 AuthorizeAttribute(User.Identitiesが設定されます)を使用すると、Windows認証が機能するようになりました。私の計画は、ユーザのロール/クレームを設定するカスタムミドルウェアを作成することですが、コンテキストはユーザがミドルウェアに設定されていません。 AuthorizeAttributeを追加しないコントローラーにUser.Identitiesも設定されません。Windows認証/承認

私の目標は、Windowsユーザ名を取得するミドルウェアを作成し、ユーザ名でサービスを呼び出して、ユーザがアクセスできるロールを取得し、ユーザのロールまたはクレームを設定することです。

public class RoleMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public RoleMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     if (!rolesSet) 
     { 
      var result = _service.GetRoles(context.User.Identity.Name); 
      //set roles 
      //set claims 
     } 

     await _next.Invoke(context); 
    } 
} 

ミドルウェアは、これを行うには、正しい場所でしょうし、私は、コントローラでAuthorizeAttributeを使用するときに私が行うのと同じ方法で、ユーザー名へのアクセスを得るために何をすべきかが必要ですか?

答えて

0

私の意見では、それを行う正しい方法ではありません。 ASP.NET IDは、要件に合わせて上書きして拡張できる豊富なクラスセットを提供します。

カスタムサービスにロールベースを注入する場合は、RoleStore(および多分RoleManager)をオーバーライドしてカスタムロールを挿入する必要があります。

また、ここで見てみる価値があるだろう:Using Role Claims in ASP.NET Identity Core

+0

タスク Setup()はいつ呼び出されますか?私たちはWindows認証を使用しているので、ユーザーはどこにでもログインして、最初のリクエストで自分のクレームと役割を自分のサービスから設定することは望ましくありません。そのため、承認部分はドットネットコアドメイン内で処理することができます。 – user568327

0

私はスタートアップ

でConfigureServicesに要件

public class CustomFunctionRequirement : IAuthorizationRequirement 
{ 
    public CustomFunctionRequirement(string function) 
    { 
     Function = function; 
    } 

    public string Function { get; } 
} 

ハンドラ

public class CustomFunctionHandler : AuthorizationHandler<CustomFunctionRequirement> 
{ 
    private readonly Service _service; 

    public CustomFunctionHandler(Service service) 
    { 
     _service = service; 
    } 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomFunctionRequirement requirement) 
    { 
     var functions = _service.GetFunctions(context.User.Identity.Name); 

     if (functions.Any(x => x == requirement.Function)) 
     { 
      context.Succeed(requirement); 
     } 

     return Task.CompletedTask; 
    } 
} 

セットアップを使用して、それを解決しました

 services.AddMvc(
      config => 
      { 
       var policy = new AuthorizationPolicyBuilder() 
        .RequireAuthenticatedUser() 
        .Build(); 
       config.Filters.Add(new AuthorizeFilter(policy)); 
      }); 

     services.AddAuthorization(
      options => 
      { 
       options.AddPolicy("User", policy => policy.Requirements.Add(new CustomRequirement("User"))); 
      }); 

私のコントローラで、authorize属性[Authorize(Policy = "User")]を追加して要件を指定できるようになりました。

+0

startup.csでの認証の設定はどうでしたか? – user3885927