我在this tutorial之后的.Net Web Api项目中实施了OAuth授权。我需要做同样的事情,但是在Azure移动应用程序项目中。它已发布,一切正常,就像Web Api一样,直到我尝试验证我对控制器的调用。当我添加authorize属性并调用api时,我应该发送一个bearer令牌。请注意,我使用PostMan和我的Web Api项目进行此操作,一切都很完美。但是,在Azure移动应用程序中,每次使用权限承载令牌调用具有authorize属性的控制器时,它都会返回“此请求的授权已被拒绝”错误。 web api项目和azure移动应用程序项目之间的代码与启动类中唯一的例外完全相同。
Web Api startup.cs:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
)
Azure移动应用程序startup.cs:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureMobileApp(app);
ConfigureAuth(app);
}
}
我认为问题与ConfigureMobileApp功能有关,因为它本身有一些身份验证代码,但我不确定。我不习惯启动课程。还是有点像菜鸟。
因此,使用持票令牌对Web api项目的每次调用都可以正常工作。每次使用承载令牌调用azure移动应用程序项目时,都会返回“此请求已被拒绝授权”错误。
我该怎么做才能解决这个问题?
谢谢!
答案 0 :(得分:2)
根据您的说明,我按照您提到的tutorial来测试此问题。根据您的代码,我假设您已创建Azure Mobile App应用程序。您可以尝试更改Configuration
方法,如下所示:
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
ConfigureMobileApp(app);
}
注意: ConfigureMobileApp
中的Startup.MobileApp.cs
方法称为此app.UseWebApi(config);
,因此您需要在此代码之前初始化中间件。
这是我的代码段,您可以参考它。
<强> 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移动应用程序。