0

IISスロー:

オブジェクト参照がオブジェクト インスタンスに設定されていません。

認証されたユーザーを/Home/Indexにリダイレクトすることになっている場合

私はそれが起こっているかもしれない理由を調査しました、そして理由を見つけることができません

行は次のとおりです。

return RedirectToAction("Index", "Home");

スタックトレース:(それが私が得る唯一の情報です)

[NullReferenceException: Object reference not set to an instance of an object.]
   System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +30
   System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +160
   System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +97
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +445
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +129
   System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +287
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +129
   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +338
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +129
   System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +282
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +129
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +236
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

編集1: アプリケーションは私のコンピューターでローカルに動作しています。すべてのフォルダをコピーしてサーバーに送信しています。次に、サーバーでローカルにアクセスしようとすると、これを取得します。サーバー上のIISは、アプリケーションプールに対して同じ構成を持っており、少なくとも私が行っているようにローカルで使用するために、正しく構成されていると思います。サーバーでローカルに動作させようとしているので、リモートで使用できるように構成します。

編集2:

これは/Home/ Indexです:

namespace gedaiapp.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {   
            return PartialView();
        }
    }
}

および/Index/ Login(クラスにはauthorize属性があり、この特定のメソッドのみにあります[AllowAnonymous])なので、まだ認証されていないユーザーはログインできます。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, FormCollection form)
{
    try
    {
        //Verifica se logon será feito utilizando certificado digital ou não
        string isDigitalCertified = form["hasDigital"];

        if (!string.IsNullOrEmpty(isDigitalCertified))
        {
            string[] isDCArr = isDigitalCertified.Split(',');

            if (!string.IsNullOrEmpty(isDCArr[0]))
            {
                string isDC = isDCArr[0];

                //Se login for utilizando certificado digital
                if (isDC == "true")
                {
                    //Resgata subject do certificado digital
                    string certDadosStr = "";
                    do
                    {
                        certDadosStr = Request.ClientCertificate.Subject;
                    } while (certDadosStr == "");

                    //Resgata cpf ou cnpj do certificado digital
                    string[] certDadosArr = certDadosStr.Split(',');
                    int Count = certDadosArr.Count();
                    //Razão social é sempre o último elemento no padrão ICP-Brasil
                    string razaoSocial = certDadosArr[Count - 1];
                    string[] razaoSocialArr = razaoSocial.Split(':');
                    Count = razaoSocialArr.Count();
                    string key = razaoSocialArr[Count - 1];
                    //Resgata Guid do usuário
                    MembershipUser user = Membership.GetUser(model.UserName);
                    Guid userID = (Guid)user.ProviderUserKey;

                    //Verifica se (cpf ou cnpj) do usuário efetuando o login é o mesmo do cadastrado no sistema
                    using (gedaiappEntities context = new gedaiappEntities())
                    {
                        var keyNumberObj = from a in context.sistema_UsersCertified
                                           where a.userID == userID
                                           select a.keyNumber;
                        string keyNumber = keyNumberObj.First();

                        //Se autenticidade for positiva (redireciona)
                        if (keyNumber == key)
                        {
                            FormsAuthentication.SetAuthCookie(model.UserName, false);
                            return RedirectToAction("Index", "Home");
                        }
                        else
                        {
                            return RedirectToAction("Login", "Account");
                        }
                    }
                }//Caso login seja sem certificado digital
                else
                {
                    MembershipProvider mp = Membership.Provider;
                    if (mp.ValidateUser(model.UserName, model.Password))
                    {
                        FormsAuthentication.SetAuthCookie(model.UserName, false);
                        try
                        {
                            return RedirectToAction("Index", "Home");
                        }
                        catch (Exception e)
                        {
                            return Content("Erro: " + e);
                        }

                    }
                    return RedirectToAction("Login", "Account");
                }
            }
            else
            {
                //return Content("Erro Catastrófico: Não foi possivel identificar se login é com certificado digital ou não.");
                return RedirectToAction("Login", "Account");
            }
        }
        else
        {
            //return Content("Erro Catastrófico: Valor do checkbox hasDigital não foi enviado.");
            return RedirectToAction("Login", "Account");
        }
    }
    catch (Exception e)
    {
        return Content("Erro: " + e);
    }
}

何か助けはありますか?

4

1 に答える 1

2

追加の問題を解決しました

<modules runAllManagedModulesForAllRequests="true"/>

web.config で

PS リクエストごとにすべてのモジュールをロードするため、これは正しい方法ではありません。ロードされていないものを見つけることはできませんが。

于 2013-02-06T10:10:37.577 に答える