Owin / Mvc 添加对不记名令牌身份验证的支持
Owin / Mvc add support for bearer token authentication
我的 objective 是 Asp.Net Mvc 操作通过 OpenId 身份验证保护,并支持两种类型的客户端:浏览器和本机 WPF 应用程序。我将使用的 STS 是 ADFS 2016.
目前客户端浏览器运行良好。为此,我在我的启动 class 中配置了 UseOpenIdConnectAuthentication。
我能够调用我的 Mvc 操作(使用 Authorize 属性保护),用户被重定向到 STS,一旦身份验证完成,我返回到我的 Mvc 操作并正确填充了 ClaimsIdentity。
现在我正在尝试让本机 WPF 应用程序能够对同一 Web 应用程序中的同一 Mvc 操作进行身份验证,但事情变得越来越棘手。
在客户端(我的 WPF 应用程序),我使用 ADAL 和以下代码:
var authContext = new AuthenticationContext("<MySTSUri>");
var authResult = await authContext.AcquireTokenAsync(
"http://localhost:1276/openid/login",
"MyNativeAppId",
new Uri("myapp://openid"),
new PlatformParameters(PromptBehavior.Auto),
UserIdentifier.AnyUser,
"");
if (!string.IsNullOrEmpty(authResult.AccessToken))
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(authResult.AccessTokenType, authResult.AccessToken);
HttpResponseMessage response = await httpClient.GetAsync("http://localhost:1276/openid/login");
if (response.IsSuccessStatusCode)
{
var text = await response.Content.ReadAsStringAsync();
}
}
}
问题基本上是我无法告诉 Web 应用能够验证此类 ADAL 请求。
我在 Web 应用程序 Owin 启动文件配置中尝试了各种方法:
- 离开 UseOpenIdConnectAuthentication:这似乎还不够,我使用 Web 应用程序的 ClientId 重定向到 STS
- UseActiveDirectoryFederationServicesBearerAuthentication api 因为我知道我的 STS 将始终是 ADFS
- 使用OAuthBearerAuthentication
None 个正在工作。
请问有人可以帮忙实现吗?
我的方向对吗?
任何 ideas/pointers 将不胜感激。
谢谢,
亚历克斯
我已经设法让它工作了。我post回答记录。
对我有很大帮助的是在 web.config:
中启用 Owin 日志
<system.diagnostics>
<switches>
<add name="Microsoft.Owin" value="Verbose" />
</switches>
</system.diagnostics>
然后使用 Owin,您可以简单地链接多个身份验证方法。所以就我而言,我刚刚使用了:
app.UseActiveDirectoryFederationServicesBearerAuthentication(
new ActiveDirectoryFederationServicesBearerAuthenticationOptions
{
MetadataEndpoint = adfsMetadataEndpoint,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudiences = new[] { validAudience }
}
});
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
AuthenticationType = "OpenId",
ClientId = clientId,
Authority = authority,
RedirectUri = redirectUri,
ResponseType = OpenIdConnectResponseTypes.CodeIdToken,
Scope = "openid",
SignInAsAuthenticationType = "Cookies"
});
干杯,
亚历克斯
我的 objective 是 Asp.Net Mvc 操作通过 OpenId 身份验证保护,并支持两种类型的客户端:浏览器和本机 WPF 应用程序。我将使用的 STS 是 ADFS 2016.
目前客户端浏览器运行良好。为此,我在我的启动 class 中配置了 UseOpenIdConnectAuthentication。 我能够调用我的 Mvc 操作(使用 Authorize 属性保护),用户被重定向到 STS,一旦身份验证完成,我返回到我的 Mvc 操作并正确填充了 ClaimsIdentity。
现在我正在尝试让本机 WPF 应用程序能够对同一 Web 应用程序中的同一 Mvc 操作进行身份验证,但事情变得越来越棘手。 在客户端(我的 WPF 应用程序),我使用 ADAL 和以下代码:
var authContext = new AuthenticationContext("<MySTSUri>");
var authResult = await authContext.AcquireTokenAsync(
"http://localhost:1276/openid/login",
"MyNativeAppId",
new Uri("myapp://openid"),
new PlatformParameters(PromptBehavior.Auto),
UserIdentifier.AnyUser,
"");
if (!string.IsNullOrEmpty(authResult.AccessToken))
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(authResult.AccessTokenType, authResult.AccessToken);
HttpResponseMessage response = await httpClient.GetAsync("http://localhost:1276/openid/login");
if (response.IsSuccessStatusCode)
{
var text = await response.Content.ReadAsStringAsync();
}
}
}
问题基本上是我无法告诉 Web 应用能够验证此类 ADAL 请求。
我在 Web 应用程序 Owin 启动文件配置中尝试了各种方法:
- 离开 UseOpenIdConnectAuthentication:这似乎还不够,我使用 Web 应用程序的 ClientId 重定向到 STS
- UseActiveDirectoryFederationServicesBearerAuthentication api 因为我知道我的 STS 将始终是 ADFS
- 使用OAuthBearerAuthentication
None 个正在工作。
请问有人可以帮忙实现吗? 我的方向对吗?
任何 ideas/pointers 将不胜感激。
谢谢, 亚历克斯
我已经设法让它工作了。我post回答记录。
对我有很大帮助的是在 web.config:
<system.diagnostics>
<switches>
<add name="Microsoft.Owin" value="Verbose" />
</switches>
</system.diagnostics>
然后使用 Owin,您可以简单地链接多个身份验证方法。所以就我而言,我刚刚使用了:
app.UseActiveDirectoryFederationServicesBearerAuthentication(
new ActiveDirectoryFederationServicesBearerAuthenticationOptions
{
MetadataEndpoint = adfsMetadataEndpoint,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudiences = new[] { validAudience }
}
});
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
AuthenticationType = "OpenId",
ClientId = clientId,
Authority = authority,
RedirectUri = redirectUri,
ResponseType = OpenIdConnectResponseTypes.CodeIdToken,
Scope = "openid",
SignInAsAuthenticationType = "Cookies"
});
干杯,
亚历克斯