Asp.net mvc 4 Azure ACS为MVC WebAPI和Windows Store/Metro应用程序多次返回URL

Asp.net mvc 4 Azure ACS为MVC WebAPI和Windows Store/Metro应用程序多次返回URL,asp.net-mvc-4,microsoft-metro,acs,windows-store-apps,Asp.net Mvc 4,Microsoft Metro,Acs,Windows Store Apps,我在Azure上安装了ACS,并在Azure上托管的MVC4站点上启用了WIF。我还制作了一个Windows应用商店应用程序 为了能够从我的windows应用商店应用程序登录,我必须将此控制器放在网站上,以将登录重定向到metro应用程序中的webauthenticationbroker public HttpResponseMessage Post() { var data = this.Request.Content.ReadAsFormDataAsy

我在Azure上安装了ACS,并在Azure上托管的MVC4站点上启用了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) 我不能把代币还给地铁,因为太长了。一个包含声明的大型xml。我应该给我的客户寄什么

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

如果我没有将这个返回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();
并将提供者登录名传递给身份验证代理


还有其他方法吗?

对于1,ACS支持多种令牌格式,其中一些非常紧凑。我建议尝试一下,这是测试版。您还可以修改输出规则以减少令牌中的声明数,这将使其更小


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

您必须更改应用程序以支持它,但解析JWT非常简单,而且有类似帮助的JWT解析的现有在线示例。SWT也很紧凑,您可能更容易找到它的代码示例,尤其是在使用WIF的情况下。我设法将SWT令牌发送到客户端,但现在我无法让mvc站点在我针对web api发出请求时接受令牌。无论我在身份验证头中添加了什么,它都会在WSFederationAuthenticationModule.AuthorizationFailed中结束:(令牌示例:http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=HM81Sv2xnRD6P%2bm2W2T%2febafah2ztmxsbboq1rxqs%3d&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fClaimittyProvider=uri%3aWindowsLiveID&Audience=http%3a48451%2f&ExpiresOn=1348778300&Is)suer=https%3a%2f%2f流量理论.accesscontrol.windows.net%2f&HMACSHA256=c7d9cvmeegy1xhfv3wqpn7l9zm%2bwoXt8Z8IUf0tgmI%3dwi默认情况下不理解SWT,需要为其添加SecurityTokenHandler。有关所需配置的示例和指向处理程序的链接,请参阅。