我正在尝试使用 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 在什么时候阻止了调用。非常感谢任何建议!
谢谢 !