0

ASP.NET MVC3 Razor 项目

尝试使用http://weblogs.asp.net/haithamkhedre/archive/2011/03/13/openid-authentication-with-asp-net-mvc3-dotnetopenauth-and-openid-selector.aspx实现 OpenID

我已将 openid-en.js 脚本编辑为:

var providers_large = {
  myopenid: {
    name: 'MyOpenID',
    label: 'Enter your MyOpenID username.',
    url: 'http://{username}.myopenid.com/'
  },
  openid: {
    name: 'OpenID',
    label: 'Enter your OpenID.',
    url: null
  }
};

删除所有对 Google 的引用。我还删除了 var providers_small 部分并在 open-jqeury.js 中对其进行了引用。

这是我的 LogOn.cshtml 中的表单

<form action="Authenticate?ReturnUrl=@HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"])" method="post" id="openid_form">
<input type="hidden" name="action" value="verify" />
<div>
    <fieldset>
        <legend>Agency use only</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>

问题是,无论我做什么,Google 都会显示为第一个提供者,而且很多时候都不会列出 MyOpenID 提供者(雅虎有时也会出现)。我尝试删除 cookie 和历史记录(从 IE 并在 AppData\Roaming...\Cookies 子文件夹、AppData\Local\ 等中手动删除,重新启动 Visual Studio,重新启动计算机等。我只希望 MyOpenID 提供程序是显示。我猜 openid-en.js 已保存在我找不到的地方。我已经在整个计算机上搜索了该文件并删除了临时文件夹中的所有文件。

任何帮助,将不胜感激。

经过进一步的故障排除,我发现我可以让它只使用 MyOpenID。问题出在显示的提供程序图标中。它们总是按顺序显示;Google、Yahoo、Aol 然后它将显示 MyOpenID。因此,即使我只在 provider_large 代码块中列出了 MyOpenID,它也会将 Google 图标放在选择框上。单击 Google 图标将显示 MyOpenId,因此它是功能性的,但显然会让用户感到非常困惑。问题出在 open-jquery.js 中的这个代码块中

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>';
    },

如果我删除第二个 ---'" href="javascript:openid.signin(\"'--- 选择块是空白的,但仍然指向 MyOpenID,它会破坏功能,尽管单击选择框不会执行任何操作.如果我删除第一个 openid.signin 行为不会改变。有人知道如何修改此代码块,以便在不破坏功能的情况下显示正确的图标吗?

深入挖掘,发现 Opened-jquery.js 从opened-providers-en.png 中提取了provider 图像。当您编辑 openid-en.js providers_large 时,您必须更新 opens-providers-en.png。你可以通过运行 generate-sprite.js 来实现,它是 openid select 的一部分,需要 ImageMagick。安装了这两个,运行 generate-sprite.js 时,我收到“Microsoft JScript 运行时错误:'WScript' 未定义”错误。目前尚不清楚我如何运行 generate-sprite.js。如果我将它作为脚本包含在我的项目中,我会在 generate-sprite.js 的这部分代码中收到“Microsoft JScript 运行时错误:'WScript' is undefined”错误

var locale = 'en';
if (WScript.Arguments.length == 0) {
    // assuming english locale
} else {
    locale = WScript.Arguments(0);
} 

你如何运行 generate-sprite.js 脚本?

任何 javascript 大师都可以告诉我如何在我的 Win7 和 VS2010 Express 设置中执行此操作。

4

1 回答 1

0

回答

将 openid-selector 安装到文件夹中,并根据自述文件编辑 generate-sprite.js。然后从该文件夹中的命令行运行 wscript generate-sprite.exe。它将生成一个新的 openid-provider-en.png。我将它复制到我的图像文件夹中,MyOpenID 选择框有 MyOpenId 图标并将我连接到 MyOpenId 登录。

另请参阅WScript 未定义

于 2012-04-30T06:16:19.687 回答