2017-09-07 10 views
0

属性[AllowAnonymous]と[AuthorizeAttribute]を使用してアクセスを制御するwebapiがあります。私は、認可にいくつかのロジックを追加するカスタム属性も作成しました。 Web APIが認証にベアラトークンを使用しています。 匿名リクエストを許可するためのすべてのアクションを作成する目的で、つまり、すべてのアクションに[AllowAnonymous]属性が設定されているように動作するように、プロジェクト内に設定(InDemoという名前のbool)があります。デモモードのときにすべてのAPIコントローラの要求を許可する

OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/Token"), 
       Provider = new ApplicationOAuthProvider("self"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(30000), 
       AllowInsecureHttp = true 
      }; 

      app.UseOAuthBearerTokens(OAuthOptions); 


public class CustomApiAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     if (Settings.Default.InDemo) 
      return true; 

     // ... more custom validations 
    } 
} 

これは限り私の要求は、その後のisAuthorizedが呼び出されると、私は、カスタムの検証をバイパスすることができ、有効なベアラトークンが含まれていると正常に動作します。しかし、トークンが無効である場合、IsAuthorizedは呼び出されず、「この要求に対して承認が拒否されました」という応答が送信されます。 今度は、InDemoがtrueに設定されているときにトークンを無視したいとします。つまり、[AllowAnonymous]のような動作です。

答えて

0

ここで私はそれを解決しました。 私は自分のCustomApiAuthorizeAttributeを実装してIAuthenticationFilterを実装し、コンテキストの原則を常に認証されたものに設定しました。

public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     if (Settings.Default.AllowAnonymous) 
        context.Principal = new AuthenticatedPrincipal(Thread.CurrentPrincipal); 
    } 

    public class AuthenticatedPrincipal : IPrincipal 
    { 
     private readonly IPrincipal principalToWrap; 

     public AuthenticatedPrincipal(IPrincipal principalToWrap) 
     { 
      this.principalToWrap = principalToWrap; 
      Identity = new AuthenticatedIdentity(principalToWrap.Identity); 
     } 

     public bool IsInRole(string role) 
     { return principalToWrap.IsInRole(role); } 

     public IIdentity Identity { get; } 
    } 

    public class AuthenticatedIdentity : IIdentity 
    { 
     public AuthenticatedIdentity(IIdentity identityToWrap) 
     { 
      Name = identityToWrap.Name; 
      AuthenticationType = identityToWrap.AuthenticationType; 
     } 

     public string Name { get; } 
     public string AuthenticationType { get; } 

     public bool IsAuthenticated => true; 
    } 
関連する問題