2015-04-07 6 views
3

Я реализую идентификацию asp.net. Я переопределил классы по умолчанию с помощью первичного ключа int, а не по умолчанию String. Я выполнил следующую статью, чтобы сделать это: ArticleSignInManager бросает нуль при попытке войти в систему

Извините за весь код, однако я был застрял на этой глупой ошибке в течение некоторого времени, поэтому я скорее дал больше информации, чем меньше.

У меня есть следующие классы:

public class FskUser : IdentityUser<int, FskUserLogin, FskUserRole, FskUserClaim> 
{ 
    ... 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<FskUser, int> manager) 
    { 
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 
} 

Мой заказ SignInManager

public class FskSignInManager : SignInManager<FskUser,int> 
{ 
    public FskSignInManager(FskUserManager userManager, IAuthenticationManager authenticationManager) 
     : base(userManager, authenticationManager) 
    { 
    } 

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(FskUser user) 
    { 
     return user.GenerateUserIdentityAsync((FskUserManager)UserManager); 
    } 

    public static FskSignInManager Create(IdentityFactoryOptions<FskSignInManager> options, IOwinContext context) 
    { 
     return new FskSignInManager(context.GetUserManager<FskUserManager>(), context.Authentication); 
    } 
} 

Мои StartUp.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
    { 
     // Configure the db context, user manager and signin manager to use a single instance per request 
     app.CreatePerOwinContext(IdentityDbContext.Create); 
     app.CreatePerOwinContext<FskUserManager>(FskUserManager.Create); 
     app.CreatePerOwinContext<FskSignInManager>(FskSignInManager.Create); 

     // Enable the application to use a cookie to store information for the signed in user 
     // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     // Configure the sign in cookie 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<FskUserManager, FskUser, int>(
      validateInterval: TimeSpan.FromMinutes(30), 
      regenerateIdentityCallback: (manager, user) => 
       user.GenerateUserIdentityAsync(manager), 
      getUserIdCallback: (id) => (id.GetUserId<int>()))     
      } 
     });   app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);  
      } 

Вот мой аккаунт контроллер упрощена:

[Authorize] 
public class AccountController : Controller 
{ 
    private FskSignInManager _signInManager; 
    private FskUserManager _userManager; 

    public AccountController() 
    { 
    } 

    public AccountController(FskUserManager userManager, FskSignInManager signInManager) 
    { 
     UserManager = userManager; 
     SignInManager = signInManager; 
    } 

    public FskSignInManager SignInManager 
    { 
     get 
     { 
      if (_signInManager == null) 
      { 
       //split for debug purposes 
       var cntx = HttpContext.GetOwinContext(); 
       var tmp = cntx.Get<FskSignInManager>(); 
       return tmp; 
      } 
      else 
      { 
       return _signInManager; 
      } 
     } 
     private set 
     { 
      _signInManager = value; 
     } 
    } 

    public FskUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<FskUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

    // 
    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 
     *** line below causes the error ***    
     var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
    } 
} 

И это сообщение об ошибке, которое я получаю, когда я пытаюсь Войти:

Value cannot be null. 
    Parameter name: value 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.ArgumentNullException: Value cannot be null. 
Parameter name: value 

    Source Error: 

    Line 80: 
    Line 81:    // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
    Line 82:    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
    Line 83:    // Add custom user claims here 
    Line 84:    return userIdentity; 

    Source File: c:\Users\Dylan.AMECOR\Dropbox\Work\Code\FSK Networks Website\FSK.Domain.Repository\Services\Shared\Security\FskUser.cs Line: 82 
    Stack Trace: 
    [ArgumentNullException: Value cannot be null. 
    Parameter name: value] 
    System.Security.Claims.Claim..ctor(String type, String value, String valueType, String issuer, String originalIssuer, ClaimsIdentity subject, String propertyKey, String propertyValue) +10798181 
    System.Security.Claims.Claim..ctor(String type, String value) +34 
    Microsoft.AspNet.Identity.<CreateAsync>d__0.MoveNext() +1447 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
    System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
    FSK.Domain.Services.Services.Shared.<GenerateUserIdentityAsync>d__0.MoveNext() in c:\Users\Dylan.AMECOR\Dropbox\Work\Code\FSK Networks Website\FSK.Domain.Repository\Services\Shared\Security\FskUser.cs:82 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
    System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
    Microsoft.AspNet.Identity.CultureAwaiter`1.GetResult() +123 
    Microsoft.AspNet.Identity.Owin.<SignInAsync>d__2.MoveNext() +408 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
    System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 
    Microsoft.AspNet.Identity.CultureAwaiter.GetResult() +63 
    Microsoft.AspNet.Identity.Owin.<SignInOrTwoFactor>d__23.MoveNext() +1910 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93  System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
    System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
    Microsoft.AspNet.Identity.CultureAwaiter`1.GetResult() +67 
    Microsoft.AspNet.Identity.Owin.<PasswordSignInAsync>d__29.MoveNext() +2208 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93  System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
    System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24 
    FSK.WebSite.Web.Controllers.<Login>d__2.MoveNext() in c:\Users\Dylan.AMECOR\Dropbox\Work\Code\FSK Networks Website\FSK.WebSite.Web\Controllers\AccountController.cs:86 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 
    System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 
    System.Threading.Tasks.TaskHelpersExtensions.ThrowIfFaulted(Task task) +61 
    System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +114 
    System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +66 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49 
    System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +117 
    System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +323 
    System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +44 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50 
    System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +72 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +185 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44 
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +39 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39 
     System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39 
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +39 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38 
    System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +129 
+0

Пожалуйста, смотрите [ «Должны ли вопросы включают„метки“в их названиях?»] (http://meta.stackexchange.com/questions/19190/should-questions- include-tags-in-their-titles), где консенсус «нет, они не должны»! –

+5

Возможно, это может быть проблема с получением штампа безопасности для пользователя. Если он равен нулю, вы получите это исключение. См. Http://stackoverflow.com/questions/24991212/value-cannot-be-null-parameter-name-value-createidentityasync – Tobias

+0

Это действительно ответ. Позаботьтесь, чтобы опубликовать ответ, чтобы я мог отметить его как правильно? – Zapnologica

ответ

0

Для меня это был результат нулевой ClaimValue

user.Claims.Add(new IdentityUserClaim<string> 
      { 
       ClaimType = item.Key, 
       ClaimValue = item.Value 
      }); 

Я решил его, изменив код

user.Claims.Add(new IdentityUserClaim<string> 
      { 
       ClaimType = item.Key, 
       ClaimValue = item.Value != null ? item.Value : "" 
      }); 
Смежные вопросы