我正在尝试使用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 }
);
}
My 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在什么时候阻止了这些电话。 非常感谢任何建议!
谢谢!
答案 0 :(得分:2)
I just tested your code both on my local and Azure Web App. All worked fine. The API could be reached after adding [Authorize] attributes.
My authentication client side works and I get a valid token (verified with jwt.io).
Token will expired depends on the exp property of JWT. By default, it will expired in 60 min. Try to re-generate the token and use it to access your Web API.
答案 1 :(得分:0)
您好,请您尝试添加支持凭据:对您的角色是真的吗? 所以你的EnableCors属性看起来像这样
$("p, h1, h2").each(function(index) {
console.log("CSS Selector: ", $(this).cssSelectorName)
})
希望这有帮助。
谢谢, Bhadhri
答案 2 :(得分:0)
所以,对不起有异议!
我的问题是我从App那里调用了令牌方法:
App.IdentityClientApp.AcquireTokenAsync(new String[] { premissionScopes });
什么时候我应该完成
App.IdentityClientApp.AcquireTokenAsync(new String[] { Constants.ApplicationID });
所以是的,你应该获得带有应用程序ID的第一个令牌,然后在获得令牌后将范围提供给静默令牌获取方法。