服务结构Owin管道中的WsFederation身份验证不起作用

本文关键字:WsFederation 身份验证 不起作用 结构 Owin 管道 服务 | 更新日期: 2023-09-27 18:01:54

G'day!

我没有看到太多关于这方面的内容,因为在写这篇文章的时候,这一切都很新鲜。我正在尝试编写一个服务结构应用程序,在用户通过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管道,以便在服务结构上下文中工作?

如有任何帮助,我们将不胜感激,感谢您抽出时间!

服务结构Owin管道中的WsFederation身份验证不起作用

我不知道为什么这段代码适用于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,必要时对其进行最后调整,应该就是这样。