HTTP请求未访问WEB API 2控制器

时间:2017-06-14 13:53:59

标签: c# asp.net azure asp.net-web-api msal

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

谢谢!

3 个答案:

答案 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的第一个令牌,然后在获得令牌后将范围提供给静默令牌获取方法。