ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – Identity 2.0用户标识在MVC 5控制器初始化程序中为空

2019-07-03 04:03:34  阅读:245  来源: 互联网

标签:c asp-net asp-net-mvc-5 asp-net-identity-2


我有一个使用Asp.Net Identity 2.0的MVC 5项目.我也在使用通用的存储库模式.作为数据库模式的一部分,我有各种表的字段,用于存储插入/更新/删除用户的用户ID.因此,我想将用户对象或用户id至少传递给修改记录时要使用的通用存储库.

但是,由于我无法直接在存储库类中访问该标识,因此我尝试在存储库实例化时传递它.它看起来像这样:

using System.Data.Entity;
using System.Threading.Tasks;
using System.Net;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using My.Models;

namespace My.Controllers
{
    [Authorize]
    public class FooController : MasterController
    {
        private IGenericRepositoryAsync<Topic> _repository;

        public FooController()
        {
            //Point A
            _repository = new GenericRepositoryAsync<Foo>(User.Identity);
        }


        public async Foo<ActionResult> Index()
        {
            //POINT B
            //_repository = new GenericRepositoryAsync<Foo>(User.Identity);
            return View(await _repository.GetAllAsync());
        }
    }
}

作为“Point A”的授权用户,User.Identity为null,在// B点,它不是null,但我不想将存储库初始化程序放在每个控制器Action中.

感谢您的帮助和反馈.

解决方法:

Web Api解决方案

您可以在Authorize过滤器类上创建,然后将userId添加到Request属性集合中:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{
    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) return;

        base.OnAuthorization(actionContext);

        Guid userId;

        if (actionContext.RequestContext.Principal.Identity.IsAuthenticated
            && Guid.TryParse(actionContext.RequestContext.Principal.Identity.GetUserId(), out userId))
        {
            actionContext.Request.Properties.Add("userId", actionContext.RequestContext.Principal.Identity.GetUserId());
        }
    }
}

一旦该类存在,您必须在Application Startup类(Global.asax web_start,Startup.cs)上添加此过滤器,如下所示:

config.Filters.Add(new MyAuthorizeAttribute());

对于Owin Startup.cs将是这样的:

public void Configuration(IAppBuilder app)
{
    ConfigureOAuth(app);

    HttpConfiguration config = new HttpConfiguration();
    WebApiConfig.Register(config);
    config.Filters.Add(new MyAuthorizeAttribute());
}

然后,在您的控制器中,您将能够获得userId jus:

Guid userId = (Guid) ActionContext.Request.Properties["userId"];

MVC解决方案

对于MVC直接在Controller上使用:

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

或者在Web Api解决方案中添加过滤器:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ...
    Guid userId = filterContext.HttpContext.User.Identity.Name.GetUserId();
    ...
}

标签:c,asp-net,asp-net-mvc-5,asp-net-identity-2
来源: https://codeday.me/bug/20190703/1363140.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有