【问题标题】:OAuth authorization returns "Authorization has been denied for this request" in a Azure Mobile App projectOAuth 授权在 Azure 移动应用项目中返回“此请求的授权已被拒绝”
【发布时间】:2017-07-29 17:25:00
【问题描述】:

我在this tutorial 之后的 .Net Web Api 项目中实现了 OAuth 授权。我需要做同样的事情,但在 Azure 移动应用项目中。它已发布并且一切都像 Web Api 一样正常工作,直到我尝试验证我对控制器的调用。当我添加授权属性并调用 api 时,我应该发送一个不记名令牌。请注意,我将 PostMan 与我的 Web Api 项目一起使用,并且一切正常。但是,在 Azure 移动应用程序中,每次我使用正确的承载令牌调用具有授权属性的控制器时,都会返回“此请求的授权已被拒绝”错误。 web api 项目和 azure 移动应用程序项目之间的代码完全相同,唯一的例外是在启动类中。

Web API 启动.cs:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }
)

Azure 移动应用程序启动.cs:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {

        ConfigureMobileApp(app);
        ConfigureAuth(app);
    }
}

我认为问题与 ConfigureMobileApp 功能有关,因为它本身有一些身份验证代码,但我不确定。我不习惯入门课程。还是有点菜鸟。

因此,使用不记名令牌对 Web api 项目的每次调用都可以正常工作。每次使用承载令牌调用 azure 移动应用程序项目时,都会返回“此请求的授权已被拒绝”错误。

我能做些什么来解决这个问题???

谢谢!!

【问题讨论】:

    标签: c# .net asp.net-web-api oauth azure-mobile-services


    【解决方案1】:

    根据你的描述,我按照你提到的tutorial来测试这个问题。根据您的代码,我假设您已经创建了 Azure Mobile App 应用程序。您可以尝试如下更改您的 Configuration 方法:

    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        ConfigureMobileApp(app);
    }
    

    注意:Startup.MobileApp.cs 中的ConfigureMobileApp 方法称为app.UseWebApi(config);,因此您需要在此代码之前初始化中间件。

    这是我的代码sn-p,你可以参考一下。

    Startup.OAuth.cs

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
    
    static Startup()
    {
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/token"),
            Provider = new OAuthAppProvider(),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(2),
            AllowInsecureHttp = true
        };
    }
    
    public void ConfigureAuth(IAppBuilder app)
    {   
        app.UseOAuthAuthorizationServer(OAuthOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
    

    Startup.MobileApp.cs

    public static void ConfigureMobileApp(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
    
        new MobileAppConfiguration()
            .AddMobileAppHomeController()
            .MapApiControllers() //provides custom API capabilities for WebAPI controllers decorated with the [MobileAppController] attribute
            .ApplyTo(config);
    
        app.UseWebApi(config);
    }
    

    ValuesController.cs

    // Use the MobileAppController attribute for each ApiController you want to use  
    // from your mobile clients 
    [MobileAppController]
    [Authorize]
    public class ValuesController : ApiController
    {
        // GET api/values
        public string Get()
        {
            return "Hello World!";
        }
    }
    

    结果

    此外,Azure 移动应用使用应用服务身份验证/授权来保护您的移动后端,有关详细信息,您可以参考此官方document。此外,您可以参考 Adrian Hall 的 blog 以更好地了解 Azure 移动应用。

    【讨论】:

    • 感谢 Bruce 的快速答复。我按照你的代码编辑了我的代码,现在,当我在 PostMan 中本地测试它时,它返回以下错误:“”请求中未指定 API 版本,此请求需要指定 ZUMO-API-VERSION 为 '2.0 .0'。有关更多信息和支持的客户,请参阅:go.microsoft.com/fwlink/?LinkId=690568#2.0.0"" 这可能是什么?
    • 嗯,它添加了标题“ZUMO-API-VERSION”和值“2.0”。谢谢布鲁斯!!
    • 很高兴听到您解决了这个问题。对于ZUMO-API-VERSION,您可以在app.UseWebApi(config); 之前调用MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings(); settings.SkipVersionCheck = true; 以跳过版本检查。如果我的回答对您有帮助,请将其标记为可接受的答案,这可以帮助可能遇到相同问题的其他社区成员。
    • 抱歉迟到了。我将您的答案标记为已接受。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2016-12-22
    • 2019-07-17
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多