1
votes

Comment définir manuellement la valeur de HttpContext.User.Identity.IsAuthenticated

Je crée une application Asp.NET MVC 5. Pour ce projet, j'essaie d'implémenter un mécanisme d'authentification personnalisé (je ne veux pas utiliser d'authentification par formulaire / OWIN, etc. fournisseurs externes)

J'ai créé un attribut d'autorisation personnalisé comme suit:

HttpContext.User.Identity.IsAuthenticated

Et dans mon action de connexion, j'essaye de changer la valeur de

[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class myAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {            
        if (!HttpContext.Current.Request.IsAuthenticated)
        {
            httpContext.Response.Redirect("~/Account/Login");
        }                            

        return base.AuthorizeCore(httpContext);
    }
}

Mais elle est en lecture seule et je ne peux pas changer la valeur. Puis-je modifier sa valeur manuellement ou est-ce que je fais une erreur logique?


3 commentaires

Est docs.microsoft.com/en-us/aspnet/identity/overview/extensibil‌ ity /… utile?


Oui, c'est un excellent article, mais il couvre un remplacement complet d'un fournisseur qui, en fait, dépasse mes connaissances sur le sujet. Mais je garderai cela à l'esprit. Merci.


@emumcu est-ce que l'une des réponses ci-dessous vous a aidé? Un vote positif ou une réponse acceptée aiderait vraiment.


3 Réponses :


-1
votes

1 commentaires

Bien sûr, c'est l'une des solutions possibles, mais je préfère ne pas l'utiliser.



0
votes

Ma réponse peut ne pas vous convenir parfaitement, mais elle peut vous aider. Dans mon application ASP.NET Core MVC, les administrateurs doivent emprunter l'identité d'autres utilisateurs. Il s'agit d'une application intranet et les utilisateurs sont évidemment authentifiés par l'authentification Windows. Cela se fait grâce à une requête ajax à cette action du contrôleur:

this.HttpContext.User = identity as ClaimsPrincipal;
return true;

IdentityExtension est une classe personnalisée dont vous pouvez observer la signature ci-dessous:

public class IdentityExtension : IIdentity
{       
    public IdentityExtension()
    { }
    public IdentityExtension(string name)
    {
        this.Name = name;
    }
    public string AuthenticationType => "Kerberos";

    public bool IsAuthenticated => true;

    public string Name { get; set; }
}

La méthode UserImpersonation renvoie l'état de réussite de la méthode ReplaceUser, qui met à jour HttpContext.User de cette façon:

public async Task<JsonResult> UserImpersonation(IdentityExtension userIdentity)

l'identité étant une instance d'IdentityExtension.

J'espère que ma solution pourra être adaptée à votre cas d'utilisation!


0 commentaires

2
votes

Vous pouvez y parvenir en paramétrant manuellement HttpContext.User:

HttpContext.User.Identity.IsAuthenticated == true;
int.Parse(((ClaimsIdentity)HttpContext.User.Identity).ValueFromType("UserId")) == 123;

Il est important de définir un authenticationType personnalisé. Dans l'exemple ci-dessus, je viens d'utiliser la chaîne "Custom", mais cela peut être tout ce que vous voulez.

Avec cela, HttpContext.User.Identity.IsAuthenticated sera true .

Pour quelque chose de plus compliqué, vous pouvez ajouter des revendications comme celle-ci:

var identity = new ClaimsIdentity(new List<Claim>
{
    new Claim("UserId", "123", ClaimValueTypes.Integer32)
}, "Custom");

HttpContext.User = new ClaimsPrincipal(identity);

Cela donne:

XXX


0 commentaires