1

我在我的MVC3應用程序中設置了OpenID,我使用的是Gmail登錄。看到我的身份驗證表格。我正在實施代碼http://weblogs.asp.net/haithamkhedre/archive/2011/03/13/openid-authentication-with-asp-net-mvc3-dotnetopenauth-and-openid-selector.aspxGmail OpenID用戶不識別

當使用IIS express在本地運行時,一切正常,我可以看到else語句和buttonGreen代碼。一旦我將它部署到網絡上,它會跳轉到「if(String.IsNullOrEmpty(Model.UserName))」,然後我將以「新用戶,註冊」代碼結束。顯示model.OpenID。 該代碼與MyOpenId(我已放棄,由於其他問題)聯機工作。

成員資格數據庫已經卷入主數據庫,用戶通過OpenID登錄本地創建,分配給角色,然後將數據庫推送到網絡。我在兩週前使用了最新的DotANetOpenAuth。我使用DotANetOpenAuth.Core,DotANetOpenAuth.OpenId和DotANetOpenAuth.OpenId.RelyParty。

<form action="[email protected](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有關?它與Cookie有關嗎?我將如何解決它?

回答

0

Google向不同的OpenID領域發佈不同的OpenID聲明標識符。當您在本地登錄時,您的領域可能是'localhost',但在生產中它明顯不同,因此Google會發布不同的OpenID,導致您無法識別用戶。谷歌在這方面相當獨特。

我建議您從您的生產領域獲得您的索賠ID。

+0

生產領域主張的標識符是否依賴於IP?我將把數據庫放在由不同領域的多個用戶使用最可能的動態IP的地方。我必須能夠將用戶和角色定義一次,而不是每個新用戶?這是一個可行的方案嗎?謝謝,喬 – Joe

+0

它不是基於IP地址。領域是進入OpenID請求的字符串,它通常是網站的基本URL。例如'http:// www.yourserver.com /'。只要領域沒有改變(包括http和https在內),標識符將是相同的。 –

+0

週末將會看看這個。 – Joe