HTTP 请求未命中 WEB API 2 控制器

HTTP request doesn't hit WEB API 2 controller

我正在尝试使用 MSAL 保护网络 API 2。 我的身份验证客户端有效并且我获得了一个有效令牌(使用 jwt.io 验证)。

我有一个 Web API 2 配置如下:

网络API 配置:

public static void Register(HttpConfiguration config)
{
   config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
   config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    config.EnableCors();
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
        );
}

我的 Startup.Auth.cs 看起来像这样:

        public void ConfigureAuth(IAppBuilder app)
    {
        string clientId = "the_client_id";

        var tokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = clientId,
            ValidateIssuer = false
        };
        Debug.WriteLine("Client ID = " + tokenValidationParameters.ValidAudience);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        {
            AccessTokenFormat = new Microsoft.Owin.Security.Jwt.JwtFormat(tokenValidationParameters, new OpenIdConnectCachingSecurityTokenProvider("https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration"))
        });
    }

还有一个简单的控制器:

[Authorize]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class BundlesController : ApiController
{
    private APIContext db = new APIContext();

    // GET: api/Bundles
    public IQueryable<Bundles> GetBundles()
    {
        Claim subject = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier);
        db.Configuration.ProxyCreationEnabled = false;
        return db.Bundles.Include(x => x.Products.Select(y => y.Defects));
    }

在添加 [Authorize] 属性之前,API 非常有效并正确返回了数据。

如果我在控制器的 GET 函数中设置断点,它不会被击中,我会收到 401:此请求的授权已被拒绝。 我相当确定我在 apps.dev.microsoft.com.

中正确注册了我的应用程序

我不明白我的 API 在什么时候阻止了呼叫。 非常感谢任何建议!

谢谢!

您好,能否尝试添加支持凭据:对您的 cors 正确?。 所以您的 EnableCors 属性看起来像这样

 EnableCors [origin:*,headers:*,methods:*,supportsCredentials:true]

希望对您有所帮助。

谢谢, 巴德里

我刚刚在我的本地和 Azure Web 应用程序上测试了你的代码。一切正常。添加 [Authorize] 属性后可以达到 API。

My authentication client side works and I get a valid token (verified with jwt.io).

Token 是否过期取决于 JWT 的 exp 属性。默认情况下,它将在 60 分钟后过期。尝试重新生成令牌并使用它来访问您的 Web API.

所以,很抱歉打扰了!

我的问题是我是从 App 调用令牌方法的:

App.IdentityClientApp.AcquireTokenAsync(new String[] { premissionScopes });

我应该做的时候

App.IdentityClientApp.AcquireTokenAsync(new String[] { Constants.ApplicationID });

所以是的,您应该使用应用程序 ID 获取第一个令牌,然后在获得令牌后将范围提供给静默令牌获取方法。