2016-09-01 2 views
0

Ich habe gerade ein ASP.MVC-Projekt erstellt und möchte eine temporäre Anmeldung bereitstellen (nennen wir es Gast-Login). Dies sollte keine Registrierung erfordern und ich möchte die Erstellung eines Datenbankeintrags für diesen Benutzer vermeiden.SignInManager.SignIn mit nicht existierendem Benutzer

I erweitert die Standard-Login-Aktion des Account von:

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 ... 
} 

Der SignIn-Aufruf schlägt fehl mit:
System.InvalidOperationException: UserId nicht gefunden.

Ist es möglich, dies irgendwie zu archivieren, oder nicht?

Dank im Voraus

Antwort

0

Okay,

der Teufel im ClaimsIdentityFactory liegt, die einige Benutzerentität bezogenen Ansprüche hinzuzufügen versucht (z.B. Ansprüche Benutzerrolle oder Sicherheitstempel) bei der Anmeldung ausgeführt.

Indem dies verhindert wird, scheint die Anmeldung bei nicht vorhandenen Benutzern kein Problem mehr zu sein.

Dies ist meine Ansprüche Fabrikklasse:

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; 
    } 
} 
Verwandte Themen