SignInManager尝试登录时抛出null

时间:2015-04-07 13:27:03

标签: c# asp.net asp.net-mvc-4 owin asp.net-identity-2

我正在实施asp.net身份。我使用int主键而不是默认String覆盖了默认类。我按照以下文章进行了操作:Article

很抱歉所有的代码,但是我已经坚持了一段时间这个愚蠢的错误,所以我宁愿给出更多的信息而不是更少。

我有以下课程:

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

2 个答案:

答案 0 :(得分:0)

对我而言,这是null 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 : ""
            });

答案 1 :(得分:0)

我坚持SignInManager无法以相同的错误登录新创建的用户。

解决方案:

我发现,仅在创建角色时向用户提供角色即可解决问题。

await userManager.AddToRoleAsync(user, UserRoles.Basic.ToString());
相关问题