ASP.Net WebApi响应未经授权的访问

时间:2017-01-04 07:57:41

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

我正在Azure上托管ASP.Net webapi。其实我有two different subscription

  1. 对于Azure Active Directory - 请说明其demo.onmicrosoft.com
  2. 用于托管webapi。 - 说它托管在abc.azurewebsites.net
  3. 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无法识别它。

    更多更新 - Startup.cs

      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" />
    

2 个答案:

答案 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