服务结构Owin管道中的WsFederation身份验证不起作用
本文关键字:WsFederation 身份验证 不起作用 结构 Owin 管道 服务 | 更新日期: 2023-09-27 18:01:54
我没有看到太多关于这方面的内容,因为在写这篇文章的时候,这一切都很新鲜。我正在尝试编写一个服务结构应用程序,在用户通过ACS进行身份验证后为web应用程序(html/js(提供服务。我可以很容易地在非服务结构环境中使用OWIN,即IIS后面的传统Asp-Net应用程序。我正在尝试将令牌身份验证与Azure访问控制一起使用。
那么,我现在使用服务结构改变了OWIN的工作方式,这与此有关吗?下面是我的服务结构应用程序中Startup.cs中的OWIN ConfigureApp((函数:
public static void ConfigureApp(IAppBuilder appBuilder)
{
appBuilder.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions());
appBuilder.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = _realm,
MetadataAddress = _acsXmlMetaDataUrl
});
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
appBuilder.UseWebApi(config);
}
请注意,我是如何在web api中间件之前注入WsFederation中间件的,该中间件最终将用于为我的浏览器html/js应用程序提供服务。现在,当它启动时,我做了一个健全性测试,比如导航到REST url,我的内容会立即得到服务,而不是重定向到Azure访问控制来登录并获得身份验证令牌。在具有相同OWIN配置的传统Asp-Net应用程序中,在提供任何资源之前,我确实被重定向到Azure访问控制。
因此,我的问题是如何将WsFed中间件注入OWIN管道,以便在服务结构上下文中工作?
如有任何帮助,我们将不胜感激,感谢您抽出时间!
我不知道为什么这段代码适用于MVC而不适用于Service Fabric。我也有同样的问题,但我找到了一种方法让它为SF工作。
这篇文章提供了一个教程。
基本上,在您的代码中,您并没有告诉它进行身份验证。你正在设置一切,但你没有启动它。
app.Map("/login", map =>
{
map.Run(async ctx =>
{
if (ctx.Authentication.User == null ||
!ctx.Authentication.User.Identity.IsAuthenticated)
{
ctx.Response.StatusCode = 401;
}
else
{
ctx.Response.Redirect("/");
}
});
});
app.Run(async ctx =>
{
var user = ctx.Authentication.User;
var response = ctx.Response;
response.ContentType = "text/html";
if (user != null && user.Identity.IsAuthenticated)
{
await response.WriteAsync(string.Format("<h2>{0}</h2>",
user.Claims.First().Issuer));
await response.WriteAsync("<dl>");
foreach (var claim in user.Claims)
{
await response.WriteAsync(string.Format(
"<dt>{0}</dt> <dd>{1}</dd>",
claim.Type,
claim.Value));
}
await response.WriteAsync("</dl>");
}
else
{
await ctx.Response.WriteAsync("<h2>anonymous</h2>");
}
});
当你访问网站上的链接时,应用程序中的代码。Run开始执行以检查你是否登录。如果你没有登录,在这种情况下,它会在页面上写"匿名",而不是加载你的内容。要进行身份验证,请转到您的wesite/login,它会将您重定向到配置中的任何身份验证提供程序。
结论:添加登录、注销和应用程序。运行snippets,必要时对其进行最后调整,应该就是这样。