How get current user in asp.net core
up vote
58
down vote
favorite
I want to get current user for getting information of user such as email.
But i cant do that in asp.net core.I'm so confused
This is my code.
HttpContext
almost is null in constructor of controller.
It's not good get user in each action.I Wanna get information of user once and set them into ViewData
;
public DashboardController()
{
var user = HttpContext.User.GetUserId();
}
asp.net .net asp.net-identity asp.net-core
add a comment |
up vote
58
down vote
favorite
I want to get current user for getting information of user such as email.
But i cant do that in asp.net core.I'm so confused
This is my code.
HttpContext
almost is null in constructor of controller.
It's not good get user in each action.I Wanna get information of user once and set them into ViewData
;
public DashboardController()
{
var user = HttpContext.User.GetUserId();
}
asp.net .net asp.net-identity asp.net-core
2
Using with MVC or Web APi ?
– Tushar
Apr 15 '16 at 8:05
1
i'm using mvc .
– Mehran Hafizi
Apr 15 '16 at 8:07
add a comment |
up vote
58
down vote
favorite
up vote
58
down vote
favorite
I want to get current user for getting information of user such as email.
But i cant do that in asp.net core.I'm so confused
This is my code.
HttpContext
almost is null in constructor of controller.
It's not good get user in each action.I Wanna get information of user once and set them into ViewData
;
public DashboardController()
{
var user = HttpContext.User.GetUserId();
}
asp.net .net asp.net-identity asp.net-core
I want to get current user for getting information of user such as email.
But i cant do that in asp.net core.I'm so confused
This is my code.
HttpContext
almost is null in constructor of controller.
It's not good get user in each action.I Wanna get information of user once and set them into ViewData
;
public DashboardController()
{
var user = HttpContext.User.GetUserId();
}
asp.net .net asp.net-identity asp.net-core
asp.net .net asp.net-identity asp.net-core
edited Sep 29 '16 at 8:13
Kirk
3,51322042
3,51322042
asked Apr 15 '16 at 7:54
Mehran Hafizi
5161413
5161413
2
Using with MVC or Web APi ?
– Tushar
Apr 15 '16 at 8:05
1
i'm using mvc .
– Mehran Hafizi
Apr 15 '16 at 8:07
add a comment |
2
Using with MVC or Web APi ?
– Tushar
Apr 15 '16 at 8:05
1
i'm using mvc .
– Mehran Hafizi
Apr 15 '16 at 8:07
2
2
Using with MVC or Web APi ?
– Tushar
Apr 15 '16 at 8:05
Using with MVC or Web APi ?
– Tushar
Apr 15 '16 at 8:05
1
1
i'm using mvc .
– Mehran Hafizi
Apr 15 '16 at 8:07
i'm using mvc .
– Mehran Hafizi
Apr 15 '16 at 8:07
add a comment |
7 Answers
7
active
oldest
votes
up vote
95
down vote
accepted
User.FindFirst(ClaimTypes.NameIdentifier).Value
EDIT for constructor
Below code works:
public Controller(IHttpContextAccessor httpContextAccessor)
{
var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
}
Edit for RTM
You should register IHttpContextAccessor
:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
1
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
1
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
1
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
1
ClaimTypes.NameIdentifier
gives the current user id, andClaimTypes.Name
gives the username.
– Nikolay Kostov
Mar 7 '17 at 16:16
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
|
show 1 more comment
up vote
26
down vote
Simple way that works and I checked.
var user = await _userManager.GetUserAsync(HttpContext.User);
then you can all the properties of this variables like user.Email
. I hope this would help someone.
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
1
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
1
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
add a comment |
up vote
18
down vote
Have another way of getting current user in Asp.NET Core - and I think I saw it somewhere here, on SO ^^
// Stores UserManager
private readonly UserManager<ApplicationUser> _manager;
// Inject UserManager using dependency injection.
// Works only if you choose "Individual user accounts" during project creation.
public DemoController(UserManager<ApplicationUser> manager)
{
_manager = manager;
}
// You can also just take part after return and use it in async methods.
private async Task<ApplicationUser> GetCurrentUser()
{
return await _manager.GetUserAsync(HttpContext.User);
}
// Generic demo method.
public async Task DemoMethod()
{
var user = await GetCurrentUser();
string userEmail = user.Email; // Here you gets user email
string userId = user.Id;
}
That code goes to controller named DemoController. Won't work without both await (won't compile) ;)
This requires the use of Identity
– Fraze
Sep 27 at 17:43
What is ApplicationUser?
– Mike
Dec 13 at 15:47
add a comment |
up vote
11
down vote
It would appear that as of now (April of 2017) that the following works:
public string LoggedInUser => User.Identity;
At least while within a Controller
3
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
1
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
1
As someone who hadn't seen the=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.
– Nathan Clement
Oct 22 at 16:46
add a comment |
up vote
3
down vote
My problem was to access the logged in User as an object in the cshtml file. Considering you wanted the user in ViewData, this approach might be helpful:
In the cshtml file
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email
</title>
</head>
<body>
</body>
</html>
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
add a comment |
up vote
1
down vote
In addition to existing answers I'd like to add that you can also have a class instance available app-wide which holds user-related data like UserID
etc.
It may be useful for refactoring e.g. you don't want to fetch UserID
in every controller action and declare an extra UserID
parameter in every method related to Service Layer.
I've done a research and here's my post.
You just extend your class which you derive from DbContext
by adding UserId
property (or implement a custom Session
class which has this property).
At filter level you can fetch your class instance and set UserId
value.
After that wherever you inject your instance - it will have the necessary data (lifetime must be per request, so you register it using AddScoped
method).
Working example:
public class AppInitializationFilter : IAsyncActionFilter
{
private DBContextWithUserAuditing _dbContext;
public AppInitializationFilter(
DBContextWithUserAuditing dbContext
)
{
_dbContext = dbContext;
}
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next
)
{
string userId = null;
int? tenantId = null;
var claimsIdentity = (ClaimsIdentity)context.HttpContext.User.Identity;
var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
userId = userIdClaim.Value;
}
var tenantIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == CustomClaims.TenantId);
if (tenantIdClaim != null)
{
tenantId = !string.IsNullOrEmpty(tenantIdClaim.Value) ? int.Parse(tenantIdClaim.Value) : (int?)null;
}
_dbContext.UserId = userId;
_dbContext.TenantId = tenantId;
var resultContext = await next();
}
}
For more information see my answer.
add a comment |
up vote
-1
down vote
I got my solution
var claim = HttpContext.User.CurrentUserID();
public static class XYZ
{
public static int CurrentUserID(this ClaimsPrincipal claim)
{
var userID = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"UserID").Value;
return Convert.ToInt32(userID);
}
public static string CurrentUserRole(this ClaimsPrincipal claim)
{
var role = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"Role").Value;
return role;
}
}
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f36641338%2fhow-get-current-user-in-asp-net-core%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
7 Answers
7
active
oldest
votes
7 Answers
7
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
95
down vote
accepted
User.FindFirst(ClaimTypes.NameIdentifier).Value
EDIT for constructor
Below code works:
public Controller(IHttpContextAccessor httpContextAccessor)
{
var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
}
Edit for RTM
You should register IHttpContextAccessor
:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
1
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
1
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
1
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
1
ClaimTypes.NameIdentifier
gives the current user id, andClaimTypes.Name
gives the username.
– Nikolay Kostov
Mar 7 '17 at 16:16
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
|
show 1 more comment
up vote
95
down vote
accepted
User.FindFirst(ClaimTypes.NameIdentifier).Value
EDIT for constructor
Below code works:
public Controller(IHttpContextAccessor httpContextAccessor)
{
var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
}
Edit for RTM
You should register IHttpContextAccessor
:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
1
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
1
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
1
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
1
ClaimTypes.NameIdentifier
gives the current user id, andClaimTypes.Name
gives the username.
– Nikolay Kostov
Mar 7 '17 at 16:16
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
|
show 1 more comment
up vote
95
down vote
accepted
up vote
95
down vote
accepted
User.FindFirst(ClaimTypes.NameIdentifier).Value
EDIT for constructor
Below code works:
public Controller(IHttpContextAccessor httpContextAccessor)
{
var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
}
Edit for RTM
You should register IHttpContextAccessor
:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
User.FindFirst(ClaimTypes.NameIdentifier).Value
EDIT for constructor
Below code works:
public Controller(IHttpContextAccessor httpContextAccessor)
{
var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
}
Edit for RTM
You should register IHttpContextAccessor
:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
edited Aug 14 '16 at 14:44
answered Apr 15 '16 at 8:22
adem caglin
9,92542849
9,92542849
1
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
1
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
1
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
1
ClaimTypes.NameIdentifier
gives the current user id, andClaimTypes.Name
gives the username.
– Nikolay Kostov
Mar 7 '17 at 16:16
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
|
show 1 more comment
1
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
1
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
1
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
1
ClaimTypes.NameIdentifier
gives the current user id, andClaimTypes.Name
gives the username.
– Nikolay Kostov
Mar 7 '17 at 16:16
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
1
1
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
it works in actions.but i wanna use in constructor of controller.
– Mehran Hafizi
Apr 15 '16 at 8:31
1
1
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
is it possible use this in classes?
– Mehran Hafizi
Apr 15 '16 at 8:53
1
1
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
because of dependency injection, yes you can use
– adem caglin
Apr 15 '16 at 8:55
1
1
ClaimTypes.NameIdentifier
gives the current user id, and ClaimTypes.Name
gives the username.– Nikolay Kostov
Mar 7 '17 at 16:16
ClaimTypes.NameIdentifier
gives the current user id, and ClaimTypes.Name
gives the username.– Nikolay Kostov
Mar 7 '17 at 16:16
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
Does this work for Web Api as well as MVC?
– Jin Izzraeel
Dec 9 '17 at 0:37
|
show 1 more comment
up vote
26
down vote
Simple way that works and I checked.
var user = await _userManager.GetUserAsync(HttpContext.User);
then you can all the properties of this variables like user.Email
. I hope this would help someone.
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
1
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
1
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
add a comment |
up vote
26
down vote
Simple way that works and I checked.
var user = await _userManager.GetUserAsync(HttpContext.User);
then you can all the properties of this variables like user.Email
. I hope this would help someone.
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
1
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
1
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
add a comment |
up vote
26
down vote
up vote
26
down vote
Simple way that works and I checked.
var user = await _userManager.GetUserAsync(HttpContext.User);
then you can all the properties of this variables like user.Email
. I hope this would help someone.
Simple way that works and I checked.
var user = await _userManager.GetUserAsync(HttpContext.User);
then you can all the properties of this variables like user.Email
. I hope this would help someone.
answered Feb 27 '17 at 18:24
Ahmad
96411323
96411323
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
1
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
1
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
add a comment |
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
1
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
1
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
works great for me inside a controller in asp.net Core 2.0
– jmdon
Mar 26 at 16:59
1
1
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
what is a _userManager?
– NullVoxPopuli
Jul 20 at 12:23
1
1
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
In ASP.NET Core Identity, User Manager is a service provided by Dependency Inject to Create Users. See docs for more info:
– Ahmad
Jul 20 at 14:25
add a comment |
up vote
18
down vote
Have another way of getting current user in Asp.NET Core - and I think I saw it somewhere here, on SO ^^
// Stores UserManager
private readonly UserManager<ApplicationUser> _manager;
// Inject UserManager using dependency injection.
// Works only if you choose "Individual user accounts" during project creation.
public DemoController(UserManager<ApplicationUser> manager)
{
_manager = manager;
}
// You can also just take part after return and use it in async methods.
private async Task<ApplicationUser> GetCurrentUser()
{
return await _manager.GetUserAsync(HttpContext.User);
}
// Generic demo method.
public async Task DemoMethod()
{
var user = await GetCurrentUser();
string userEmail = user.Email; // Here you gets user email
string userId = user.Id;
}
That code goes to controller named DemoController. Won't work without both await (won't compile) ;)
This requires the use of Identity
– Fraze
Sep 27 at 17:43
What is ApplicationUser?
– Mike
Dec 13 at 15:47
add a comment |
up vote
18
down vote
Have another way of getting current user in Asp.NET Core - and I think I saw it somewhere here, on SO ^^
// Stores UserManager
private readonly UserManager<ApplicationUser> _manager;
// Inject UserManager using dependency injection.
// Works only if you choose "Individual user accounts" during project creation.
public DemoController(UserManager<ApplicationUser> manager)
{
_manager = manager;
}
// You can also just take part after return and use it in async methods.
private async Task<ApplicationUser> GetCurrentUser()
{
return await _manager.GetUserAsync(HttpContext.User);
}
// Generic demo method.
public async Task DemoMethod()
{
var user = await GetCurrentUser();
string userEmail = user.Email; // Here you gets user email
string userId = user.Id;
}
That code goes to controller named DemoController. Won't work without both await (won't compile) ;)
This requires the use of Identity
– Fraze
Sep 27 at 17:43
What is ApplicationUser?
– Mike
Dec 13 at 15:47
add a comment |
up vote
18
down vote
up vote
18
down vote
Have another way of getting current user in Asp.NET Core - and I think I saw it somewhere here, on SO ^^
// Stores UserManager
private readonly UserManager<ApplicationUser> _manager;
// Inject UserManager using dependency injection.
// Works only if you choose "Individual user accounts" during project creation.
public DemoController(UserManager<ApplicationUser> manager)
{
_manager = manager;
}
// You can also just take part after return and use it in async methods.
private async Task<ApplicationUser> GetCurrentUser()
{
return await _manager.GetUserAsync(HttpContext.User);
}
// Generic demo method.
public async Task DemoMethod()
{
var user = await GetCurrentUser();
string userEmail = user.Email; // Here you gets user email
string userId = user.Id;
}
That code goes to controller named DemoController. Won't work without both await (won't compile) ;)
Have another way of getting current user in Asp.NET Core - and I think I saw it somewhere here, on SO ^^
// Stores UserManager
private readonly UserManager<ApplicationUser> _manager;
// Inject UserManager using dependency injection.
// Works only if you choose "Individual user accounts" during project creation.
public DemoController(UserManager<ApplicationUser> manager)
{
_manager = manager;
}
// You can also just take part after return and use it in async methods.
private async Task<ApplicationUser> GetCurrentUser()
{
return await _manager.GetUserAsync(HttpContext.User);
}
// Generic demo method.
public async Task DemoMethod()
{
var user = await GetCurrentUser();
string userEmail = user.Email; // Here you gets user email
string userId = user.Id;
}
That code goes to controller named DemoController. Won't work without both await (won't compile) ;)
edited Sep 9 at 20:39
Jay Jay Jay
9401539
9401539
answered Aug 17 '16 at 13:00
Hekkaryk
357212
357212
This requires the use of Identity
– Fraze
Sep 27 at 17:43
What is ApplicationUser?
– Mike
Dec 13 at 15:47
add a comment |
This requires the use of Identity
– Fraze
Sep 27 at 17:43
What is ApplicationUser?
– Mike
Dec 13 at 15:47
This requires the use of Identity
– Fraze
Sep 27 at 17:43
This requires the use of Identity
– Fraze
Sep 27 at 17:43
What is ApplicationUser?
– Mike
Dec 13 at 15:47
What is ApplicationUser?
– Mike
Dec 13 at 15:47
add a comment |
up vote
11
down vote
It would appear that as of now (April of 2017) that the following works:
public string LoggedInUser => User.Identity;
At least while within a Controller
3
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
1
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
1
As someone who hadn't seen the=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.
– Nathan Clement
Oct 22 at 16:46
add a comment |
up vote
11
down vote
It would appear that as of now (April of 2017) that the following works:
public string LoggedInUser => User.Identity;
At least while within a Controller
3
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
1
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
1
As someone who hadn't seen the=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.
– Nathan Clement
Oct 22 at 16:46
add a comment |
up vote
11
down vote
up vote
11
down vote
It would appear that as of now (April of 2017) that the following works:
public string LoggedInUser => User.Identity;
At least while within a Controller
It would appear that as of now (April of 2017) that the following works:
public string LoggedInUser => User.Identity;
At least while within a Controller
answered Apr 18 '17 at 15:10
Grandizer
1,26112750
1,26112750
3
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
1
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
1
As someone who hadn't seen the=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.
– Nathan Clement
Oct 22 at 16:46
add a comment |
3
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
1
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
1
As someone who hadn't seen the=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.
– Nathan Clement
Oct 22 at 16:46
3
3
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
You cannot implicitly convert type 'System.Security.Principal.IIdentity' to 'string'.
– Anthony Huang
Mar 15 at 19:21
1
1
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
string LoggedInUser = User.Identity.Name;
– Alic W
Sep 1 at 3:27
1
1
As someone who hadn't seen the
=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.– Nathan Clement
Oct 22 at 16:46
As someone who hadn't seen the
=>
operator used like this before, it is called an "Expression Body Definition" and is described in this documentation. Just in case future people like me are wondering.– Nathan Clement
Oct 22 at 16:46
add a comment |
up vote
3
down vote
My problem was to access the logged in User as an object in the cshtml file. Considering you wanted the user in ViewData, this approach might be helpful:
In the cshtml file
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email
</title>
</head>
<body>
</body>
</html>
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
add a comment |
up vote
3
down vote
My problem was to access the logged in User as an object in the cshtml file. Considering you wanted the user in ViewData, this approach might be helpful:
In the cshtml file
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email
</title>
</head>
<body>
</body>
</html>
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
add a comment |
up vote
3
down vote
up vote
3
down vote
My problem was to access the logged in User as an object in the cshtml file. Considering you wanted the user in ViewData, this approach might be helpful:
In the cshtml file
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email
</title>
</head>
<body>
</body>
</html>
My problem was to access the logged in User as an object in the cshtml file. Considering you wanted the user in ViewData, this approach might be helpful:
In the cshtml file
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email
</title>
</head>
<body>
</body>
</html>
answered May 2 at 12:52
MikeMajara
10919
10919
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
add a comment |
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
Any idea how you might get a navigation property to load (Company name of a company navigation property on my ApplicationUser class). Didn't see a way to include navigation properties.
– Hunter Nelson
Oct 2 at 5:39
add a comment |
up vote
1
down vote
In addition to existing answers I'd like to add that you can also have a class instance available app-wide which holds user-related data like UserID
etc.
It may be useful for refactoring e.g. you don't want to fetch UserID
in every controller action and declare an extra UserID
parameter in every method related to Service Layer.
I've done a research and here's my post.
You just extend your class which you derive from DbContext
by adding UserId
property (or implement a custom Session
class which has this property).
At filter level you can fetch your class instance and set UserId
value.
After that wherever you inject your instance - it will have the necessary data (lifetime must be per request, so you register it using AddScoped
method).
Working example:
public class AppInitializationFilter : IAsyncActionFilter
{
private DBContextWithUserAuditing _dbContext;
public AppInitializationFilter(
DBContextWithUserAuditing dbContext
)
{
_dbContext = dbContext;
}
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next
)
{
string userId = null;
int? tenantId = null;
var claimsIdentity = (ClaimsIdentity)context.HttpContext.User.Identity;
var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
userId = userIdClaim.Value;
}
var tenantIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == CustomClaims.TenantId);
if (tenantIdClaim != null)
{
tenantId = !string.IsNullOrEmpty(tenantIdClaim.Value) ? int.Parse(tenantIdClaim.Value) : (int?)null;
}
_dbContext.UserId = userId;
_dbContext.TenantId = tenantId;
var resultContext = await next();
}
}
For more information see my answer.
add a comment |
up vote
1
down vote
In addition to existing answers I'd like to add that you can also have a class instance available app-wide which holds user-related data like UserID
etc.
It may be useful for refactoring e.g. you don't want to fetch UserID
in every controller action and declare an extra UserID
parameter in every method related to Service Layer.
I've done a research and here's my post.
You just extend your class which you derive from DbContext
by adding UserId
property (or implement a custom Session
class which has this property).
At filter level you can fetch your class instance and set UserId
value.
After that wherever you inject your instance - it will have the necessary data (lifetime must be per request, so you register it using AddScoped
method).
Working example:
public class AppInitializationFilter : IAsyncActionFilter
{
private DBContextWithUserAuditing _dbContext;
public AppInitializationFilter(
DBContextWithUserAuditing dbContext
)
{
_dbContext = dbContext;
}
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next
)
{
string userId = null;
int? tenantId = null;
var claimsIdentity = (ClaimsIdentity)context.HttpContext.User.Identity;
var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
userId = userIdClaim.Value;
}
var tenantIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == CustomClaims.TenantId);
if (tenantIdClaim != null)
{
tenantId = !string.IsNullOrEmpty(tenantIdClaim.Value) ? int.Parse(tenantIdClaim.Value) : (int?)null;
}
_dbContext.UserId = userId;
_dbContext.TenantId = tenantId;
var resultContext = await next();
}
}
For more information see my answer.
add a comment |
up vote
1
down vote
up vote
1
down vote
In addition to existing answers I'd like to add that you can also have a class instance available app-wide which holds user-related data like UserID
etc.
It may be useful for refactoring e.g. you don't want to fetch UserID
in every controller action and declare an extra UserID
parameter in every method related to Service Layer.
I've done a research and here's my post.
You just extend your class which you derive from DbContext
by adding UserId
property (or implement a custom Session
class which has this property).
At filter level you can fetch your class instance and set UserId
value.
After that wherever you inject your instance - it will have the necessary data (lifetime must be per request, so you register it using AddScoped
method).
Working example:
public class AppInitializationFilter : IAsyncActionFilter
{
private DBContextWithUserAuditing _dbContext;
public AppInitializationFilter(
DBContextWithUserAuditing dbContext
)
{
_dbContext = dbContext;
}
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next
)
{
string userId = null;
int? tenantId = null;
var claimsIdentity = (ClaimsIdentity)context.HttpContext.User.Identity;
var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
userId = userIdClaim.Value;
}
var tenantIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == CustomClaims.TenantId);
if (tenantIdClaim != null)
{
tenantId = !string.IsNullOrEmpty(tenantIdClaim.Value) ? int.Parse(tenantIdClaim.Value) : (int?)null;
}
_dbContext.UserId = userId;
_dbContext.TenantId = tenantId;
var resultContext = await next();
}
}
For more information see my answer.
In addition to existing answers I'd like to add that you can also have a class instance available app-wide which holds user-related data like UserID
etc.
It may be useful for refactoring e.g. you don't want to fetch UserID
in every controller action and declare an extra UserID
parameter in every method related to Service Layer.
I've done a research and here's my post.
You just extend your class which you derive from DbContext
by adding UserId
property (or implement a custom Session
class which has this property).
At filter level you can fetch your class instance and set UserId
value.
After that wherever you inject your instance - it will have the necessary data (lifetime must be per request, so you register it using AddScoped
method).
Working example:
public class AppInitializationFilter : IAsyncActionFilter
{
private DBContextWithUserAuditing _dbContext;
public AppInitializationFilter(
DBContextWithUserAuditing dbContext
)
{
_dbContext = dbContext;
}
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next
)
{
string userId = null;
int? tenantId = null;
var claimsIdentity = (ClaimsIdentity)context.HttpContext.User.Identity;
var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (userIdClaim != null)
{
userId = userIdClaim.Value;
}
var tenantIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == CustomClaims.TenantId);
if (tenantIdClaim != null)
{
tenantId = !string.IsNullOrEmpty(tenantIdClaim.Value) ? int.Parse(tenantIdClaim.Value) : (int?)null;
}
_dbContext.UserId = userId;
_dbContext.TenantId = tenantId;
var resultContext = await next();
}
}
For more information see my answer.
edited Oct 20 at 8:48
answered Oct 20 at 7:25
Alex Herman
603614
603614
add a comment |
add a comment |
up vote
-1
down vote
I got my solution
var claim = HttpContext.User.CurrentUserID();
public static class XYZ
{
public static int CurrentUserID(this ClaimsPrincipal claim)
{
var userID = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"UserID").Value;
return Convert.ToInt32(userID);
}
public static string CurrentUserRole(this ClaimsPrincipal claim)
{
var role = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"Role").Value;
return role;
}
}
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
add a comment |
up vote
-1
down vote
I got my solution
var claim = HttpContext.User.CurrentUserID();
public static class XYZ
{
public static int CurrentUserID(this ClaimsPrincipal claim)
{
var userID = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"UserID").Value;
return Convert.ToInt32(userID);
}
public static string CurrentUserRole(this ClaimsPrincipal claim)
{
var role = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"Role").Value;
return role;
}
}
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
add a comment |
up vote
-1
down vote
up vote
-1
down vote
I got my solution
var claim = HttpContext.User.CurrentUserID();
public static class XYZ
{
public static int CurrentUserID(this ClaimsPrincipal claim)
{
var userID = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"UserID").Value;
return Convert.ToInt32(userID);
}
public static string CurrentUserRole(this ClaimsPrincipal claim)
{
var role = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"Role").Value;
return role;
}
}
I got my solution
var claim = HttpContext.User.CurrentUserID();
public static class XYZ
{
public static int CurrentUserID(this ClaimsPrincipal claim)
{
var userID = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"UserID").Value;
return Convert.ToInt32(userID);
}
public static string CurrentUserRole(this ClaimsPrincipal claim)
{
var role = claimsPrincipal.Claims.ToList().Find(r => r.Type ==
"Role").Value;
return role;
}
}
answered May 10 at 16:55
neeraj rai
1
1
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
add a comment |
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
While this code may answer the question, providing additional context regarding how and why it solves the problem would improve the answer's long-term value.
– Alexander
May 10 at 17:04
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f36641338%2fhow-get-current-user-in-asp-net-core%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
Using with MVC or Web APi ?
– Tushar
Apr 15 '16 at 8:05
1
i'm using mvc .
– Mehran Hafizi
Apr 15 '16 at 8:07