使用身份对ASP.NET MVC中的用户进行身份验证

时间:2018-09-28 15:37:21

标签: c# authentication asp.net-mvc-5 asp.net-identity

我对实际身份验证的工作方式非常困惑,以致class MyClass { constructor(databaseURL) { this.url = databaseURL; } async init() { //make connection to database } async complete_TaskA_onDB() { //... } async complete_TaskB_onDB() { //... } async close_connection() { //close connection to database } } 不会将我重定向到登录页面。

这是我的配置:

//constructor()
this.db = new MongoClient(new Server(dbHost, dbPort));

//init()
this.db.open();

//taskA()
this.db.collection(...).update(...);

//close_connection()
this.db.close();

在控制器中,我想调用[Authorize]方法,对用户进行身份验证并返回布尔值。但是,我不知道实际的身份验证如何工作。 在public class IdentityConfig { public void Configuration(IAppBuilder app) { app.CreatePerOwinContext(() => new MyANTon.DataContext.AntContext()); app.CreatePerOwinContext<UserManager>(UserManager.Create); app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) => new RoleManager<AppRole>( new RoleStore<AppRole>(context.Get<MyANTon.DataContext.AntContext>()))); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Home/Login"), }); } } 中,我将创建一个票证,该如何处理身份?

这就是我所拥有的:

Authenticate(string Email, String Password)

2 个答案:

答案 0 :(得分:1)

您正在朝正确的方向前进,您正在做的就是使用OAuth简化令牌的映射,并让OWin处理浏览器信息。因此,通过像您一样使用[Authorize]属性,您如何处理身份签名?就像上面提到的Forms身份验证一样,您仍然必须创建Identity / Claim令牌。在我的项目中,我做这样的事情

   protected void IdentitySignin(IUserModel userModel, string providerKey = null, bool isPersistent = true)
        {
            var claims                                                         = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, userModel.Id.ToString()),
                new Claim(ClaimTypes.Name, userModel.UserName),
                new Claim("UserContext", userModel.ToString())
            };
            var identity                                                       = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
            AuthenticationManager.SignIn(new AuthenticationProperties
            {
                IsPersistent                                                   = isPersistent,
                ExpiresUtc                                                     = DateTime.UtcNow.AddDays(7)
            }, identity);
        }

这将强制OWIN / OAuth登录用户,并且在我的web.config中,我具有以下内容:

<system.webserver>
    <authentication mode="None" />
</system.webserver>

然后注销我的用户,并强制浏览器获取新令牌:

 protected void IdentitySignout()
        {
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie,
                                            DefaultAuthenticationTypes.ExternalCookie);
        }

我的AuthenticationManager定义如下:

   private IAuthenticationManager AuthenticationManager
        {
            get { return HttpContext.GetOwinContext().Authentication; }
        }

这是Microsoft.OWin.IOwinContext的一部分,如果该引用不存在,则必须添加该引用。

您可以通过web.config文件或基本控制器处理未经授权的用户,我选择了基本控制器选项,如下所示:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (UserContext == null || UserContext.Id.Equals(Guid.Empty))
            {
                if (filterContext.Controller.GetType()     == typeof(AccountController) || filterContext.Controller.GetType() == typeof(HomeController)) return;
                filterContext.Result                       = new RedirectResult("/Home/Index");
                return;
            }
}

但是,如果需要,您也可以通过AuthorizeAttribute来实现。该链接将详细介绍如何处理Oauth和Asp.Net MVC,乍一看似乎令人生畏,但如果您决定将其他提供程序纳入发行版,则它为使用其他提供程序提供了很好的布局。

https://www.codeproject.com/Articles/577384/Introduction-to-OAuth-in-ASP-NET-MVC

答案 1 :(得分:0)

当您想Login进入web-site时,可以将token发送到client,然后您可以将其用于请求和响应,换句话说,您必须从服务器端登录。

但是,当您想从logoutweb-site时,客户端必须知道您想要logout这不仅适用于服务器,客户端应针对日志记录执行此操作

我想建议你Token-JWT

如果您想了解JWT,请单击here

如果您愿意,我会为您创建一个示例。