Estou desenvolvendo um aplicativo da web MVC 5 usando a abordagem Entity Framework 5 Database First . Estou usando OWIN para autenticação de usuários. Abaixo mostra o meu método de login no meu controlador de conta.
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user != null)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Como você pode ver, estou criando um ClaimIdentity e adicionando várias declarações a ele e, em seguida, passando-o para o OWIN usando o AuthenticationManager para fazer o login.
O problema que estou tendo é que não tenho certeza de como acessar as declarações no resto do meu aplicativo, seja nos controladores ou nas visualizações do Razor.
Eu tentei a abordagem listada neste tutorial
Por exemplo, eu tentei isso no meu código do controlador na tentativa de obter acesso aos valores passados para as reivindicações, no entanto, o usuário.Claim é igual a nulo
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
Talvez eu esteja faltando alguma coisa aqui.
ATUALIZAR
Com base na resposta de Darin, adicionei seu código, mas ainda não consigo ver o acesso às Reivindicações. Por favor, veja a captura de tela abaixo mostrando o que eu vejo quando passei o mouse sobre a identidade. Reivindicações.
Respostas:
Experimente isto:
fonte
Você também pode fazer isso:
Atualizar
Para fornecer mais explicações de acordo com os comentários.
Se você estiver criando usuários em seu sistema da seguinte maneira:
Você deve ter automaticamente algumas reivindicações preenchidas relacionadas à sua identidade.
Para adicionar declarações personalizadas após a autenticação de um usuário, você pode fazer isso da seguinte maneira:
As afirmações podem ser lidas como Darin respondeu acima ou como eu respondi.
As reivindicações são mantidas quando você chama abaixo, passando a identidade em:
fonte
Eu faço minha própria classe estendida para ver o que eu preciso, então quando eu preciso em meu controlador ou meu View, eu apenas adiciono o using ao meu namespace algo assim:
No meu controlador:
Na minha navalha:
fonte
return claim?.Value;
porque por que nãoEssa é uma alternativa se você não quiser usar reivindicações o tempo todo. Dê uma olhada neste tutorial de Ben Foster.
Então você pode adicionar um controlador básico.
Em seu controlador, você faria:
fonte
Para aprofundar a resposta de Darin, você pode obter suas reivindicações específicas usando o método FindFirst :
fonte
Você também pode fazer isso.
fonte
Lembre-se de que, para consultar o IEnumerable, você precisa fazer referência a system.linq.
Ele fornecerá o objeto de extensão necessário para fazer:
fonte
a versão mais curta e simplificada da resposta de @Rosdi Kasim'd é
Claimname
é a reivindicação que você deseja recuperar, ou seja, se você estiver procurando por uma reivindicação "StreedAddress", a resposta acima será assimfonte
No entanto, é melhor adicionar as declarações dentro do método "GenerateUserIdentityAsync", especialmente se regenerateIdentity no Startup.Auth.cs estiver habilitado.
fonte
GenerateUserIdentityAsync
foi uma sugestão incrível, eu a ignorei totalmente. Muito obrigado, Basil.De acordo com a classe ControllerBase, você pode obter as declarações para o usuário que está executando a ação.
veja como você pode fazer isso em 1 linha.
fonte
fonte
Eu usei assim no meu controlador de base. Apenas compartilhando para pronto para uso.
fonte