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 获取第一个令牌,然后在获得令牌后将范围提供给静默令牌获取方法。
我正在尝试使用 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 获取第一个令牌,然后在获得令牌后将范围提供给静默令牌获取方法。