代码之家  ›  专栏  ›  技术社区  ›  Amir Chatrbahr

资源服务器中的OwinMiddleware实现抑制令牌验证

  •  0
  • Amir Chatrbahr  · 技术社区  · 7 年前

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
             var issuer = "my issuer";
             var audience= "my audience";
             var clientId= "my client id";
             app.UseActiveDirectoryFederationServicesBearerAuthentication(
                new ActiveDirectoryFederationServicesBearerAuthenticationOptions
                {
                    TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidAudience = audience,
                        ValidIssuer = issuer,
                        IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) => parameters.IssuerSigningTokens.FirstOrDefault()?.SecurityKeys?.FirstOrDefault()
                    },
                    // Setting the MetadataEndpoint so the middleware can download the RS256 certificate
                    MetadataEndpoint = $"{issuer.TrimEnd('/')}/wsfed/{clientId}/FederationMetadata/2007-06/FederationMetadata.xml"
                });
    
    
    
            HttpConfiguration config = new HttpConfiguration();
    
            app.Use<HttpUsernameInjector>();
    
            // Web API routes
            config.MapHttpAttributeRoutes();
            app.UseWebApi(config);
        }
    }
    

    和我的自定义OwinMiddleWare:

    public class HttpUsernameInjector : OwinMiddleware
    {
        public HttpUsernameInjector(OwinMiddleware next)
            : base(next)
        {
        }
    
        public override async Task Invoke(IOwinContext context)
        {
            const string usernameClaimKey = "my username claim key";
    
            var bearerString = context.Request.Headers["Authorization"];
            if (bearerString != null && bearerString.StartsWith("Bearer ", StringComparison.InvariantCultureIgnoreCase))
            {
                var tokenString = bearerString.Substring(7);
    
                var token = new JwtSecurityToken(tokenString);
                var claims = token.Claims.ToList();
                var username = claims.FirstOrDefault(x => x.Type == usernameClaimKey);
    
                if (username == null) throw new Exception("Token should have username");
    
                // Add to HttpContext
                var genericPrincipal = new GenericPrincipal(new GenericIdentity(username.Value), new string[] { });
    
                IPrincipal principal = genericPrincipal;
    
                context.Request.User = principal;
            }
    
            await Next.Invoke(context);
        }
    }
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   Amir Chatrbahr    7 年前

    OWINMiddleware没有什么问题,只是分配 context.Request.User 导致问题。 GenericIdentity IsAuthenticated 等于true且不可能设置为 false .分配时 context.Request.User = genericPrincipal; it覆盖 已验证 context.Request.User 具有 已验证 genericPrincipal 已验证 在里面 .

    public override async Task Invoke(IOwinContext context)
        {
            if (context.Authentication.User.Identity.IsAuthenticated)
            {
                //my username injection logic
            }
            await Next.Invoke(context);
        }