0

我正在尝试使用 MSAL 保护 Web API 2。我的身份验证客户端工作,我得到一个有效的令牌(用 jwt.io 验证)。

我有一个这样配置的 Web API 2:

WebAPI 配置:

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 : Authorization has been denied for this request。我很确定我在apps.dev.microsoft.com 中正确注册了我的应用程序。

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

谢谢 !

4

3 回答 3

2

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

我的身份验证客户端工作,我得到一个有效的令牌(用 jwt.io 验证)。

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

于 2017-06-15T09:32:03.340 回答
0

嗨,您可以尝试添加支持凭据:对您的 cors 是真的吗?所以你的 EnableCors 属性看起来像这样

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

希望这可以帮助。

谢谢, 巴德里

于 2017-06-14T15:57:34.827 回答
0

所以,打扰了!

我的问题是我以这种方式从 App 调用令牌方法:

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

当我应该做的时候

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

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

于 2017-06-20T08:03:45.407 回答