【问题标题】:Claims GetUserId is null声明 GetUserId 为空
【发布时间】:2015-05-08 18:20:18
【问题描述】:

我希望你们都很棒,这次我来这里是要问一个我无法弄清楚的问题,它是关于身份的,问题是我想从 Claims 主体或任何地方获取用户 ID是的,现在我唯一拥有的就是

var principal = ClaimsPrincipal.Current;
        var id1 = principal.Claims.FirstOrDefault(c => c.ValueType == ClaimTypes.NameIdentifier);

但是当我尝试获取 UserId 并转到声明中的信息时,即使我在登录时将其保存在 AuthorizationTicket 中,我也找不到该值。

我正在使用 MVC 模板和 Web api 服务我的服务托管在 IIS 中,我通过 Token 使用 accountcontroller 管理身份验证

这是我的身份验证属性

public static AuthenticationProperties CreateProperties(string userName, string userid)
    {
        IDictionary<string, string> data = new Dictionary<string, string> { { "userName", userName }, { "userId", userid } };
        return new AuthenticationProperties(data);
    }

还有我的 GrantResourceOwnerCredentiales

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
        //var userManager = DependencyResolver.Current.GetService<ApplicationUserManager>();

        AppJobSeeker user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName, user.Id);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);...

我有一个创建 AuthenticationTicket 的方法,它也接收 UserName 和 UserId

private void CreateTicket(SignInResult result, SignInModel model, string returnUrl)
    {
        //Let's keep the user authenticated in the MVC webapp.
        //By using the AccessToken, we can use User.Identity.Name in the MVC controllers to make API calls.
        FormsAuthentication.SetAuthCookie(result.AccessToken, model.RememberMe);

        //Create an AuthenticationTicket to generate a cookie used to authenticate against Web API.
        //But before we can do that, we need a ClaimsIdentity that can be authenticated in Web API.
        var claims = new[]
        {
            new Claim(ClaimTypes.Name, result.UserName), //Name is the default name claim type, and UserName is the one known also in Web API.
            new Claim(ClaimTypes.NameIdentifier, result.UserId), //If you want to use User.Identity.GetUserId in Web API, you need a NameIdentifier claim.
        };

        //Generate a new ClaimsIdentity, using the DefaultAuthenticationTypes.ApplicationCookie authenticationType.
        //This also matches what we've set up in Web API.
        var authTicket = new AuthenticationTicket(new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie), new AuthenticationProperties
        {
            ExpiresUtc = result.Expires,
            IsPersistent = model.RememberMe,
            IssuedUtc = result.Issued,
            RedirectUri = returnUrl
        });

...

登录时一切看起来都很好,但是当我转到另一个控制器时,我无法检索用户 ID

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-identity owin


    【解决方案1】:

    您是否已将 [Authorize] 属性添加到您的控制器?

    [Authorize]
    public class AuthorizeController : ApiController
    {
       public Task<IHttpActionResult> GetUserId()
       {
           return Ok(HttpContext.Current.User.Identity.GetUserId());
       }
    }
    

    【讨论】:

    • 谢谢 Rikard,我解决了这个问题,我在错误的地方使用了 GetUserId。 (MVC 端)当我必须在 WebApi 端使用它时。
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多