Azure Active Directory 身份验证 - 在 MVC 中同时使用 OpenId Connect 和 Bearer 身份验证
Azure Active Directory Authentication - Using both OpenId Connect and Bearer Authentication in MVC
我创建了一个 MVC 应用程序,它使用 Azure Active Directory 身份验证和 OpenId。这对最终用户非常有用,但我想向站点添加一个 webjob,它将调用自己的端点(用户将使用的相同的 http post 方法)。我发现这个示例 https://github.com/AzureADSamples/Daemon-DotNet 允许服务器应用程序调用 webapi 端点。
我的授权配置 class 如下所示:
public class StartAuth
{
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
private static string audience = ConfigurationManager.AppSettings["ida:Audience"];
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
});
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = tenant,
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = audience
}
});
}
}
来自我的 Web 作业控制台应用程序的请求如下所示(我已经替换了不记名密钥和主机):
POST
https://some-random-host/myendpoint
HTTP/1.1
Authorization: Bearer key
Host: some-random-host
Content-Length: 0
来自服务器的响应如下所示(替换了主机、密钥、租户 ID,并截断了位置值):
HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 0
Location: https://login.windows.net/tenant-id/oauth2/authorize....
Server: Microsoft-IIS/8.0
Set-Cookie: OpenIdConnect.nonce.u%noncekey; path=/; secure; HttpOnly
WWW-Authenticate: Bearer
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=key;Path=/;Domain=some-random-host
Date: Thu, 19 Mar 2015 11:44:11 GMT
知道服务器为什么响应登录位置吗?当用户尝试访问经过身份验证的端点时,这显然非常有效,但不适用于我的控制台应用程序。
提前感谢您的帮助。如果有任何其他信息有用,请告诉我。
一个相关Blog post here that explains in detail:
您的配置看起来正确,但您缺少处理程序的定义。
您需要在 API 控制器中指定处理程序 class :
[HostAuthentication("OAuth2Bearer")]
[Authorize]
public class YourAPIController : ApiController
{
HostAuthentication 关键字描述了您的控制器的处理程序。
由于 Azure WebJobs 在使用密钥进行身份验证时未绑定到特定用户,因此您不能在 method/controller 上具有指定用户的授权属性。这完全有道理,但在 Omer 提醒我检查属性之前我忽略了这一点。
实际上用户实际上是null
所以与其拥有:
[授权(用户="user@contoso.com"]
我只需要:
[授权]
我不确定是否有办法指定只有 WebJob 有权限。
我创建了一个 MVC 应用程序,它使用 Azure Active Directory 身份验证和 OpenId。这对最终用户非常有用,但我想向站点添加一个 webjob,它将调用自己的端点(用户将使用的相同的 http post 方法)。我发现这个示例 https://github.com/AzureADSamples/Daemon-DotNet 允许服务器应用程序调用 webapi 端点。
我的授权配置 class 如下所示:
public class StartAuth
{
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
private static string audience = ConfigurationManager.AppSettings["ida:Audience"];
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
});
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = tenant,
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = audience
}
});
}
}
来自我的 Web 作业控制台应用程序的请求如下所示(我已经替换了不记名密钥和主机):
POST
https://some-random-host/myendpoint
HTTP/1.1
Authorization: Bearer key
Host: some-random-host
Content-Length: 0
来自服务器的响应如下所示(替换了主机、密钥、租户 ID,并截断了位置值):
HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 0
Location: https://login.windows.net/tenant-id/oauth2/authorize....
Server: Microsoft-IIS/8.0
Set-Cookie: OpenIdConnect.nonce.u%noncekey; path=/; secure; HttpOnly
WWW-Authenticate: Bearer
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=key;Path=/;Domain=some-random-host
Date: Thu, 19 Mar 2015 11:44:11 GMT
知道服务器为什么响应登录位置吗?当用户尝试访问经过身份验证的端点时,这显然非常有效,但不适用于我的控制台应用程序。
提前感谢您的帮助。如果有任何其他信息有用,请告诉我。
一个相关Blog post here that explains in detail:
您的配置看起来正确,但您缺少处理程序的定义。
您需要在 API 控制器中指定处理程序 class :
[HostAuthentication("OAuth2Bearer")]
[Authorize]
public class YourAPIController : ApiController
{
HostAuthentication 关键字描述了您的控制器的处理程序。
由于 Azure WebJobs 在使用密钥进行身份验证时未绑定到特定用户,因此您不能在 method/controller 上具有指定用户的授权属性。这完全有道理,但在 Omer 提醒我检查属性之前我忽略了这一点。
实际上用户实际上是null
所以与其拥有: [授权(用户="user@contoso.com"] 我只需要: [授权]
我不确定是否有办法指定只有 WebJob 有权限。