在OpenID Offline Provider中成功(虚假)登录后重定向用户

时间:2011-07-05 07:33:12

标签: asp.net-mvc authentication openid offline

很多天前,我问this question,我设置了一个有效的离线OpenID提供商(我猜)。

我想要的是一个简单的OpenID标识符登录文本框,它会自动接受用户并认为用户已登录,然后我希望他被重定向到主产品页面(Products => Index)。 / p>

但是,我不知道(并且没有在互联网上找到)的是如何在假身份验证过程之后继续。

我试着这样做:

[HttpPost]
public ActionResult Login(string openid)//openid is the identifier taken from the login textbox
{
    var rely = new OpenIdRelyingParty();
    var req = rely.CreateRequest(openid);
    req.RedirectToProvider();
    return RedirectToAction("Index", "Products");
}

首先,它没有被重定向到第4行(而是刷新登录页面),其次,没有经过身份验证的用户确实存在,我的意思是当我在Watch窗口中检查User时,它是不是null但是Username是空的,没有经过身份验证的身份,我想这意味着没有设置cookie。

P.S: 1.没有例外。但是当我尝试调用FormsAuthentication.RedirectFromLogin()方法时,我得到一个异常(服务器无法在设置HTTP标头后修改cookie)。 2.索引操作方法标有[Authorize]属性,因此当有人试图浏览Products时,它会被重定向到登录屏幕,但是当他登录时(假登录),不应该将其重定向回来到产品页面?

我也尝试了这个:

[HttpPost]
public ActionResult Login(string openid)
{
    var rely = new OpenIdRelyingParty();
    return rely.CreateRequest(openid).RedirectingResponse.AsActionResult();
}

但没有运气。

我错过了什么?以及如何使其按预期工作?我可以依靠自己,但我需要一个适合OpenID的文档,特别是对于离线本地提供商。

1 个答案:

答案 0 :(得分:1)

选中此示例:OpenID and OAuth using DotNetOpenAuth in ASP.NET MVC

public ActionResult OpenId(string openIdUrl)
{
    var response = Openid.GetResponse();
    if (response == null)
    {
        // User submitting Identifier
        Identifier id;
        if (Identifier.TryParse(openIdUrl, out id))
        {
            try
            {
                var request = Openid.CreateRequest(openIdUrl);
                var fetch = new FetchRequest();
                fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
                fetch.Attributes.AddRequired(WellKnownAttributes.Name.First);
                fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last);
                request.AddExtension(fetch);
                return request.RedirectingResponse.AsActionResult();
            }
            catch (ProtocolException ex)
            {
                _logger.Error("OpenID Exception...", ex);
                return RedirectToAction("LoginAction");
            }
        }
        _logger.Info("OpenID Error...invalid url. url='" + openIdUrl + "'");
        return RedirectToAction("Login");
    }

    // OpenID Provider sending assertion response
    switch (response.Status)
    {
        case AuthenticationStatus.Authenticated:
            var fetch = response.GetExtension<FetchResponse>();
            string firstName = "unknown";
            string lastName = "unknown";
            string email = "unknown";
            if(fetch!=null)
            {
                firstName = fetch.GetAttributeValue(WellKnownAttributes.Name.First);
                lastName = fetch.GetAttributeValue(WellKnownAttributes.Name.Last);
                email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
            }
            // Authentication       
            FormsAuthentication.SetAuthCookie(userName: email, createPersistentCookie: false);
            // Redirection
            return RedirectToAction("Index", "Products");
        case AuthenticationStatus.Canceled:
            _logger.Info("OpenID: Cancelled at provider.");
            return RedirectToAction("Login");
        case AuthenticationStatus.Failed:
            _logger.Error("OpenID Exception...", response.Exception);
            return RedirectToAction("Login");
    }
    return RedirectToAction("Login");
}

基本上,您的操作方法被调用两次:

用户首次提交表单。

第二次是来自OpenID提供商的回叫(重定向)。 这次,response会有一个值。如果response.Status有效,您可以使用FormsAuthentication课程登录用户,最后您可以将其重定向到主要产品页面。