我正在Azure上托管ASP.Net webapi
。其实我有two different subscription
demo.onmicrosoft.com
abc.azurewebsites.net
abc.azurewebsites.net
上托管的我的api已在demo.onmicrosoft.com
上注册。我的客户端应用是一个服务应用,它针对驻留在demo.onmicrosoft.com
中的用户进行身份验证。身份验证是基本身份验证,方法是传递用户凭据并从AccessToken
接收Azure Active Directory
。收到来自demo.onmicrosoft.com
的令牌后,我正在调用来自abc.azurewebsites.net
的api。像这样:
https://abc.azurewebsites.net/api/some/queryapi
现在,在我的控制器中,如果我使用
[Authorize]
public class SomeController:ApiController
{
//my code
}
我正在获取授权访问权限。如果我从控制器中删除该属性,它工作正常。 你可以帮帮我吗。即使是在注册app&认证为什么我这样做。是因为两种不同的订阅或其他原因。
我正以这种方式向我的webapi发送令牌
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
}
IMO,因为我的令牌来自其他订阅的azure广告,所以我的webapi无法识别它。
public void ConfigureAuth(IAppBuilder app)
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new TokenValidationParameters {
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
},
});
}
的Web.config
<add key="ida:Tenant" value="demo.onmicrosoft.com" />
<add key="ida:Audience" value="https://demo.onmicrosoft.com/4e4xxxx5-5xx1-4355-8xxc-705xxxx163" />
<add key="ida:ClientID" value="d0xxxxa-2xxx6-4xx-9e58-07xxxxxxxx1" />
答案 0 :(得分:1)
这与您保护Web API而不是Azure订阅的方式有关。例如,以下是一段代码,用于在.net核心中使用Azure AD保护Web API:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Add the console logger.
loggerFactory.AddConsole(LogLevel.Debug);
// Configure the app to use Jwt Bearer Authentication
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAD:Tenant"]),
Audience = Configuration["AzureAd:Audience"],
Events = new JwtBearerEvents
{
OnTokenValidated = tokenValidated ,
OnAuthenticationFailed= AuthenticationFailed
}
});
}
此Web API将验证令牌的签名,以确保从Azure AD发出令牌。然后,它将检查访问令牌中的aud
声明。如果我们在上面的代码中配置aud
声明也匹配,我们就可以成功调用Web API。
答案 1 :(得分:0)
1)。确保关闭Azure身份验证。
2)。在StartupAuth.cs
中 PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
// Note: Remove the following line before you deploy to production:
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
请遵循以下文章:https://www.asp.net/web-api/overview/security/individual-accounts-in-web-api