2016-06-17 45 views
2

在我的MVC Web应用程序中使用WsFederation Authentication时,我遇到登录循环的问题。我使用visual studio创建web应用程序的脚手架,并在Startup.cs中设置WsFederation。它生成以下代码块:WsFederation身份验证登录循环

public class Startup 
{ 
    private static string realm = ConfigurationManager.AppSettings["ida:Wtrealm"]; 
    private static string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"]; 

    public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions 
     { 
      Wtrealm = realm, 
      MetadataAddress = adfsMetadata 
     }); 
    } 
} 

Web应用程序托管在Azure中,并且ADFS位于本地。

在某些客户,当登录尝试登录页面进入请求新的令牌导致ADFS服务器上的以下异常的循环:

异常详细信息: Microsoft.IdentityServer.Web。 InvalidRequestException:MSIS7042:相同的客户端浏览器会话在最后'7'秒内发出'6'请求。详情请联系您的管理员。

我已阅读StackOverflow上很多文章,看了看被谁写IdentityServer的家伙提供的各种例子,我已经尝试了各种配置选项,我不能将问题隔离到一个特定的区域。

从我读到的是OWIN中间件丢失对象的上下文的一般问题,结果令牌变得“丢失”。

我试图实现一些sample code其他人提供的StackOverflow,但是,我似乎无法找到解决方案解决我的问题,或者也许没有正确实施代码。

任何想法?

+0

我已经能够在我的本地环境中复制这个问题,但我没有更接近完全理解问题的原因。我添加了一个IP作为绑定到我的IIS Express配置,以便我可以远程访问该网站进行调试。这样做可以一致地复制循环。当我从“192.168.1.20:44341/”访问网站时;登录工作。但是,当我从“localhost:44341 /”访问网站时;登录循环发生。依赖方信任端点IP地址是我的IP地址。 –

回答

3

问题的原因是请求和响应URL不一致。即当用户输入网站URL并且没有用HTTPS加前缀时,重定向循环就会发生。

原因被隐藏,因为如果用户未经过身份验证或授权,用户会立即重定向到ADFS。

我不得不这样做是为了确保所有的用户请求被重定向到HTTPS URL和HTTP绑定被删除。(无论是或会就好了工作)

这是我使用的代码确保所有请求都重定向到https。

<system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="Redirect to https"> 
      <match url="(.*)"/> 
      <conditions> 
      <add input="{HTTPS}" pattern="Off"/> 
      <add input="{REQUEST_METHOD}" pattern="^get$|^head$" /> 
      </conditions> 
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/> 
     </rule> 
     </rules> 
    </rewrite> 
    </system.webServer> 

我希望这篇文章很有帮助。