1

我已经在我的 MVC3 应用程序中设置了 OpenID,并且我正在使用 gmail 登录。请参阅下面的身份验证表。我在http://weblogs.asp.net/haithamkhedre/archive/2011/03/13/openid-authentication-with-asp-net-mvc3-dotnetopenauth-and-openid-selector.aspx中实现代码

当使用 IIS express 在本地运行时,一切正常,我得到 else 语句和 buttonGreen 代码。一旦我将它部署到网络上,它就会在“if (String.IsNullOrEmpty(Model.UserName))”上跳闸,最后我会看到“新用户,注册”代码。显示模型.OpenID。该代码使用 MyOpenId 在线工作(由于其他问题我已经放弃了)。

会员数据库已滚入主数据库,并通过 OpenID 登录在本地创建用户,分配角色,然后将数据库推送到 Web。截至两周前,我正在使用最新的 DotANetOpenAuth。我正在使用 DotANetOpenAuth.Core、DotANetOpenAuth.OpenId 和 DotANetOpenAuth.OpenId.RelyParty。

<form action="Authenticate?ReturnUrl=@HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"])" method="post" id="openid_form">
<input type="hidden" name="action" value="verify" />
<div>
    <fieldset>
        <legend>Login using OpenID</legend>
        <div class="openid_choice">
            <p> Please click your account provider:</p>
            <div id="openid_btns"></div>
        </div>
        <div id="openid_input_area">
            @Html.TextBox("openid_identifier")
            <input type="submit" value="Log On" />
        </div>
        <noscript>
            <p>
                OpenID is service that allows you to log-on to many different websites using a single
                indentity. Find out <a href="http://openid.net/what/">more about OpenID</a> and
                <a href="http://openid.net/get/">how to get an OpenID enabled account</a>.</p>
        </noscript>
        <div>
            @if (Model != null)
            {
                if (String.IsNullOrEmpty(Model.UserName))
                {
                  <div class="editor-label">
                      @Html.LabelFor(model => model.OpenID)
                  </div>
                  <div class="editor-field">
                      @Html.DisplayFor(model => model.OpenID)
                  </div>
                  <p class="button">
                      @Html.ActionLink("New User, Register", "Register", new { OpenID = Model.OpenID })
                  </p>
                }
                else
                {
                //user exist 
                  <p class="buttonGreen">
                    <a href="@Url.Action("Index", "TalPro")">Welcome @Model.UserName, Continue... </a>
                  </p>
                }
            }
        </div>
    </fieldset>
</div>
</form>

这是javascript:openid-jquery.js

/*
    Simple OpenID Plugin
    http://code.google.com/p/openid-selector/

    This code is licensed under the New BSD License.
*/
var providers;
var openid;

(function ($) {
openid = {
    version : '1.3', // version constant
    demo : false,
    demo_text : null,
    cookie_expires : 6 * 30, // 6 months.
    cookie_name : 'openid_provider',
    cookie_path : '/',

    img_path : '../Content/themes/base/images/',
    locale : 'en', // is set in openid-<locale>.js
    sprite : 'en', // usually equals to locale, is set in
    // openid-<locale>.js
    signin_text : 'Sign-In', // text on submit button on the form
    all_small : false, // output large providers w/ small icons
    no_sprite : false, // don't use sprite image
    image_title : '{provider}', // for image title

    input_id : null,
    provider_url : null,
    provider_id : null,

    /**
     * Class constructor
     * 
     * @return {Void}
     */
    init : function(input_id) {
        providers = $.extend({}, providers_large);
        var openid_btns = $('#openid_btns');
        this.input_id = input_id;
        $('#openid_choice').show();
        $('#openid_input_area').empty();
        var i = 0;
        // add box for each provider
        for (id in providers_large) {
            box = this.getBoxHTML(id, providers_large[id], (this.all_small ? 'small' : 'large'), i++);
            openid_btns.append(box);
        }
        $('#openid_form').submit(this.submit);
        var box_id = this.readCookie();
        if (box_id) {
            this.signin(box_id, true);
        }
    },

    /**
     * @return {String}
     */
    getBoxHTML : function(box_id, provider, box_size, index) {
        if (this.no_sprite) {
            var image_ext = box_size == 'small' ? '.ico.gif' : '.gif';
            return '<a title="' + this.image_title.replace('{provider}', provider["name"]) + '" href="javascript:openid.signin(\'' + box_id + '\');"'
                    + ' style="background: #FFF url(' + this.img_path + '../images.' + box_size + '/' + box_id + image_ext + ') no-repeat center center" '
                    + 'class="' + box_id + ' openid_' + box_size + '_btn"></a>';
        }
        var x = box_size == 'small' ? -index * 24 : -index * 100;
        var y = box_size == 'small' ? -60 : 0;
        return '<a title="' + this.image_title.replace('{provider}', provider["name"]) + '" href="javascript:openid.signin(\'' + box_id + '\');"'
                + ' style="background: #FFF url(' + this.img_path + 'openid-providers-' + this.sprite + '.png); background-position: ' + x + 'px ' + y + 'px" '
                + 'class="' + box_id + ' openid_' + box_size + '_btn"></a>';
    },

    /**
     * Provider image click
     * 
     * @return {Void}
     */
    signin : function(box_id, onload) {
        var provider = providers[box_id];
        if (!provider) {
            return;
        }
        this.highlight(box_id);
        this.setCookie(box_id);
        this.provider_id = box_id;
        this.provider_url = provider['url'];
        // prompt user for input?
        if (provider['label']) {
            this.useInputBox(provider);
        } else {
            $('#openid_input_area').empty();
            if (!onload) {
                $('#openid_form').submit();
            }
        }
    },

    /**
     * Sign-in button click
     * 
     * @return {Boolean}
     */
    submit : function() {
        var url = openid.provider_url;
        if (url) {
            url = url.replace('{username}', $('#openid_username').val());
            openid.setOpenIdUrl(url);
        }
        if (openid.demo) {
            alert(openid.demo_text + "\r\n" + document.getElementById(openid.input_id).value);
            return false;
        }
        if (url.indexOf("javascript:") == 0) {
            url = url.substr("javascript:".length);
            eval(url);
            return false;
        }
        return true;
    },

    /**
     * @return {Void}
     */
    setOpenIdUrl : function(url) {
        var hidden = document.getElementById(this.input_id);
        if (hidden != null) {
            hidden.value = url;
        } else {
            $('#openid_form').append('<input type="hidden" id="' + this.input_id + '" name="' + this.input_id + '" value="' + url + '"/>');
        }
    },

    /**
     * @return {Void}
     */
    highlight : function(box_id) {
        // remove previous highlight.
        var highlight = $('#openid_highlight');
        if (highlight) {
            highlight.replaceWith($('#openid_highlight a')[0]);
        }
        // add new highlight.
        $('.' + box_id).wrap('<div id="openid_highlight"></div>');
    },

    setCookie : function(value) {
        var date = new Date();
        date.setTime(date.getTime() + (this.cookie_expires * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
        document.cookie = this.cookie_name + "=" + value + expires + "; path=" + this.cookie_path;
    },

    readCookie : function() {
        var nameEQ = this.cookie_name + "=";
        var ca = document.cookie.split(';');
        for ( var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ')
                c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0)
                return c.substring(nameEQ.length, c.length);
        }
        return null;
    },

    /**
     * @return {Void}
     */
    useInputBox : function(provider) {
        var input_area = $('#openid_input_area');
        var html = '';
        var id = 'openid_username';
        var value = '';
        var label = provider['label'];
        var style = '';
        if (label) {
            html = '<p>' + label + '</p>';
        }
        if (provider['name'] == 'OpenID') {
            id = this.input_id;
            value = 'http://';
            style = 'background: #FFF url(' + this.img_path + 'openid-inputicon.gif) no-repeat scroll 0 50%; padding-left:18px;';
        }
        html += '<input id="' + id + '" type="text" style="' + style + '" name="' + id + '" value="' + value + '" />'
                + '<input id="openid_submit" type="submit" value="' + this.signin_text + '"/>';
        input_area.empty();
        input_area.append(html);
        $('#' + id).focus();
    },

    setDemoMode : function(demoMode) {
        this.demo = demoMode;
    }
};
})(jQuery);

为什么它会在本地工作但在网络上失败?

谢谢你。

进一步细化问题。当使用 IIS Express 在本地托管时,Model.UserName 设置正确并且登录成功。在 Web 上托管时 (DiscountASP IIS 7.0) Model.UserName 未设置并且登录失败。问题是为什么?这与IIS有关吗?它与cookies有关吗?我将如何解决它?

4

1 回答 1

0

Google 向不同的 OpenID 领域发布不同的 OpenID 声明标识符。当您在本地登录时,您的领域可能是“本地主机”,但在生产环境中显然不同,因此 Google 会发出不同的 OpenID,导致您无法识别用户。谷歌在这方面相当独特。

我建议您从您的生产领域获取您声明的 ID。

于 2012-05-10T14:20:10.567 回答