2016-09-01 3 views
0

방금 ​​ASP.MVC 프로젝트를 만들었으며 임시 로그인을 제공하려고합니다 (게스트 로그인이라고 부름). 이것은 등록을 요구하지 않아야하며이 사용자에 대한 데이터베이스 항목 작성을 피하고 싶습니다.존재하지 않는 사용자가있는 SignInManager.SignIn

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
     return View(model); 

    if (model.GuestLogin) { 
     var user = UserManager.FindByEmail(model.Email); 
     if (user != null) { 
      ModelState.AddModelError("", "Invalid login attempt."); 
      return View(model); 
     } 

     var appUser = new ApplicationUser() { Email = model.Email, UserName = model.Email, Id = Guid.NewGuid().ToString() }; 
     //var creationResult = UserManager.Create(appUser); 
     SignInManager.SignIn(appUser, false, model.RememberMe); 
     return RedirectToLocal(returnUrl); 
    } 

    //common login stuff ... 
} 

로그인의 호출이 실패 :

나는에 의해 AccountController의 기본 로그인 액션을 확장
System.InvalidOperationException : 사용자 아이디를 찾을 수 없습니다.

어떻게 든 이것을 보관할 수 있습니까, 아니라? 악마는 과정에서 기호 중 일부 사용자 엔티티와 관련된 주장 (예를 들어, 사용자 역할 또는 보안 스탬프 주장을)를 추가하려고 ClaimsIdentityFactory에 놓여 사전 좋아

답변

0

에서

감사합니다,

.

이 문제를 방지하면 존재하지 않는 사용자로 로그인하면 더 이상 문제가없는 것 같습니다.

public class MyClaimsFactory : ClaimsIdentityFactory<MyUser, string> 
{ 
    public override async Task<ClaimsIdentity> CreateAsync(UserManager<MyUser, string> manager, MyUser user, string authenticationType) 
    { 
     if (manager == null) 
      throw new ArgumentNullException("manager"); 
     if (user == null) 
      throw new ArgumentNullException("user"); 

     ClaimsIdentity claimsIdentity = new ClaimsIdentity(authenticationType, this.UserNameClaimType, this.RoleClaimType); 
     claimsIdentity.AddClaim(new Claim(this.UserIdClaimType, this.ConvertIdToString(user.Id), "http://www.w3.org/2001/XMLSchema#string")); 
     claimsIdentity.AddClaim(new Claim(this.UserNameClaimType, user.UserName, "http://www.w3.org/2001/XMLSchema#string")); 
     claimsIdentity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")); 

     if (!user.IsGuest) 
     { 
      if (manager.SupportsUserSecurityStamp) 
       claimsIdentity.AddClaim(new Claim(this.SecurityStampClaimType, await manager.GetSecurityStampAsync(user.Id).WithCurrentCulture<string>())); 

      if (manager.SupportsUserRole) 
      { 
       IList<string> list = await manager.GetRolesAsync(user.Id).WithCurrentCulture<IList<string>>(); 
       foreach (string current in list) 
       { 
        claimsIdentity.AddClaim(new Claim(this.RoleClaimType, current, "http://www.w3.org/2001/XMLSchema#string")); 
       } 
      } 
      if (manager.SupportsUserClaim) 
       claimsIdentity.AddClaims(await manager.GetClaimsAsync(user.Id).WithCurrentCulture<IList<Claim>>()); 
     } 

     return claimsIdentity; 
    } 
} 
:

이 내 주장 공장 클래스입니다