c# - Service Fabric Owin 管道中的 WsFederation 身份验证不起作用

标签 c# asp.net azure authentication ws-federation

你好!

我还没有看到太多这方面的内容,因为在撰写本文时它都是非常新的。我正在尝试编写一个服务结构应用程序,在用户通过 ACS 进行身份验证后为 Web 应用程序(html/js)提供服务。我可以轻松地使其在非服务结构环境(即 IIS 后面的传统 Asp Net 应用程序)中与 OWIN 一起使用。我正在尝试将 token 身份验证与 Azure 访问控制结合使用。

那么,与我现在使用服务结构改变了 OWIN 工作方式有关吗?下面是我的 Service Fabric 应用程序 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 中间件之前注入(inject) WsFederation 中间件,该中间件最终将用于为我的浏览器 html/js 应用程序提供服务。现在,当它启动时,我会进行健全性测试,例如导航到 REST url,我的内容将立即提供,而不是重定向到 Azure 访问控制来登录并获取身份验证 token 。在具有相同 OWIN 配置的传统 Asp Net 应用程序中,我确实在提供任何资源之前重定向到 Azure 访问控制。

所以我的问题是如何将 WsFed 中间件注入(inject) OWIN 管道,以便它可以在服务结构上下文中工作?

任何帮助将不胜感激,感谢您的宝贵时间!

最佳答案

我不知道为什么这段代码适用于 MVC 而不适用于 Service Fabric。我也遇到了同样的问题,但我找到了一种方法让它适用于 SF。

This article给出了教程。

基本上,在您的代码中,您没有告诉它进行身份验证。您正在设置一切,但尚未开始。

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>");
                }
            });

当您访问网站上的链接时,app.Run 中的代码开始执行以检查您是否已登录。如果您没有登录,在本例中,它将在页面上写入“匿名”而不是加载您的内容。要进行身份验证,转到您的网站/登录,它会将您重定向到您在配置中拥有的任何身份验证提供商

结论:添加登录、注销和 app.Run 代码段,如果需要的话可以进行最后的调整,就这样了。

关于c# - Service Fabric Owin 管道中的 WsFederation 身份验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38902532/

相关文章:

azure - 如何在azure中上传文件后获取blob-URL

azure - 将 AKS 1.21 升级到 1.25 的潜在风险

azure - 无法将文件(图像和视频)上传到 blob 存储,出现错误 : mandatory header missing "x-ms-blob-type"

c# - 为什么 Await 之后的代码不在 UI 线程上运行?

c# - 在填充 GridView 时将数据类型 varchar 转换为 float 时出错

c# - 你如何从 C# 中的 DLL 中找到基本 url?

javascript - 使用 RadButton 关闭 RadWindow

c# - 使用 net core 的 PageFactory 是否有任何替代方案

c# - 将字符串格式化为货币

c# - 在下载文件之前从 http 请求中获取文件/AssetBundle 大小