0

我在 Azure 上设置了 ACS,并在我托管在 Azure 上的 MVC 4 站点上启用了 WIF。我还制作了一个 Windows 应用商店应用程序。

为了能够从我的 Windows 商店应用程序登录,我必须将此控制器放在网站上,以将登录重定向到 Metro 应用程序中的 webauthenticationbroker。

public HttpResponseMessage Post()
        {
            var data = this.Request.Content.ReadAsFormDataAsync();
            var test = data.Result;

            var response = this.Request.CreateResponse(HttpStatusCode.Redirect);
            var identity = ((ClaimsIdentity)((ClaimsPrincipal)HttpContext.Current.User).Identity);
            var token = data.Result["wresult"];

            response.Headers.Add("Location", "/api/federation/end?acsToken=" + "hello");

            return response;
        }

有两个问题。1) 我无法将令牌归还给 Metro,因为它太长了。带有声明的大 xml。我应该向我的客户发送什么?

2) 当我使用 WebAuthenticationBroker.AuthenticateAsync - 如果我想使用以下 url 登录(它会弹出并且人们可以选择要使用的提供程序)返回 url 需要在 ACS 管理站点上设置。它需要指向我的控制器/mysite/federation/。

https://traffictheory.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=/mysite/

如果我没有将此返回 url 设置为 /mysite/,则身份验证在 mcv 站点上不起作用。

我找到了一种解决方案,将返回 url 设置为 /mysite/,然后在 Windows 商店应用程序中我需要自己解析标识符。

    var client = new HttpClient();
    var response = await client.GetAsync("https://traffictheory.accesscontrol.windows.net:443/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=/mysite/&reply_to=/mysite/federation&context=&request_id=&version=1.0&callback=");
    var result = await response.Content.ReadAsStringAsync();

并将提供者登录信息传递给身份验证代理。

还有其他方法吗?

4

1 回答 1

0

对于 1,ACS 支持多种令牌格式,其中一些非常紧凑。我建议尝试JWT,它处于测试阶段。您还可以修改输出规则以减少令牌中的声明数量,从而使其更小。

对于 2,WS-Federation 包含一个“wreply”参数,因此您可以添加“&wreply=https://mysite.com/federation”。或者,您可以在 ACS 门户中将“/federation” URL 配置为您的 RP 的默认回复 URL,在这种情况下,您不必在每个请求中都指定它。

于 2012-09-27T18:20:35.407 回答