2014-09-29 33 views
1

我正在开发一个ASP.NET MVC应用程序(targetFramework 4.5),它提供用户使用自定义身份验证以及使用他们的Twitter帐户登录到网站。以下库已引用RedisSessionStateProvider.cs与外部登录链接

  1. Microsoft.Owin
  2. Microsoft.Owin.Host.Security
  3. Microsoft.Owin.Security
  4. Microsoft.Owin.Security.Cookies
  5. Microsoft.Owin。 Security.MicrosoftAccount
  6. Microsoft.Owin.Security.OAuth和
  7. Microsoft.Owin.Security.Twitter

当我点击我的网页上的twitter按钮,它会到twitter站点,获取我的凭据并返回到我的网站。这里没有问题。

我现在整合了RedisSessionStateProvider.cs来管理使用Redis的会话。我已经添加提供程序文件(RedisSessionStateProvider.cs),我有如下更新web.config文件:

<sessionState cookieless="false" customProvider="RedisSessionStateProvider" mode="Custom" timeout="20"> 
    <providers> 
    <add name="RedisSessionStateProvider" port="6379" server="localhost" type="RedisProvider.SessionProvider.CustomServiceProvider" writeexceptionstoeventlog="true" /> 
    </providers> 
</sessionState> 

Redis的服务器正在运行,如果我点击Twitter的按钮上的端口6379.监听现在,现场带我到Twitter的认证页面,之后,从Twitter的成功认证,当回调方法

公共异步任务ExternalLoginCallback(字符串RETURNURL)

被触发,该代码

await AuthenticationManager.GetExternalLoginInfoAsync();

返回null。

如果我从配置文件中注销sessionstate节点,一切工作正常,即GetExternalLoginInfoAsync()正确返回loginInfo。

我无法确定此问题的根本原因。任何人都可以请指导我解决这个问题?

谢谢, Hemant。

回答

1

我有同样的问题。我认为RedisSessionStateProvider实现中存在一个错误。现在,我有一个临时决议:

[AllowAnonymous] 
public ActionResult Login(string returnUrl) 
{    
    // TODO: RedisSessionState provider will not works if remove it. 
    Session["hook-init-redis"] = DateTime.Now.ToString(); 

    ViewBag.ReturnUrl = returnUrl; 
    return View(); 
} 

所以,你应该写一些东西到Session,在外部登录被调用之前。