标签: forms-authentication

ASP.NET MVC - 设置自定义IIdentity或IPrincipal

我需要做一些相当简单的事情:在我的ASP.NET MVC应用程序中,我想设置一个自定义IIdentity/IPrincipal.哪个更容易/更合适.我想要扩展默认值,以便我可以调用类似User.Identity.IdUser.Identity.Role.没什么特别的,只是一些额外的属性.

我已经阅读了大量的文章和问题,但我觉得我做得比实际更难.我觉得这很容易.如果用户登录,我想设置自定义IIdentity.所以我想,我将Application_PostAuthenticateRequest在我的global.asax中实现.但是,每次请求都会调用它,并且我不希望在每个请求上调用数据库,这些请求将从数据库请求所有数据并放入自定义IPrincipal对象.这似乎也是非常不必要,缓慢,并且在错误的地方(在那里进行数据库调用)但我可能是错的.或者数据来自何处?

所以我想,每当用户登录时,我都可以在我的会话中添加一些必要的变量,我将其添加到Application_PostAuthenticateRequest事件处理程序中的自定义IIdentity中.但是,我Context.Sessionnull那里,所以这也不是要走的路.

我已经在这一天工作了一天,我觉得我错过了什么.这不应该太难,对吧?我也对此附带的所有(半)相关内容感到困惑.MembershipProvider,MembershipUser,RoleProvider,ProfileProvider,IPrincipal,IIdentity,FormsAuthentication....我是唯一一个谁发现这一切非常混乱?

如果有人能告诉我一个简单,优雅,高效的解决方案,可以在IIdentity上存储一些额外的数据而不需要额外的模糊...这将是非常棒的!我知道在SO上有类似的问题,但如果我需要的答案就在那里,我一定会忽略.

asp.net asp.net-mvc forms-authentication iprincipal iidentity

638
推荐指数
5
解决办法
21万
查看次数

如何在ASP.NET MVC中获取当前用户

在表单模型中,我曾经通过以下方式获取当前登录用户:

Page.CurrentUser
Run Code Online (Sandbox Code Playgroud)

如何在ASP.NET MVC中的控制器类中获取当前用户?

.net c# iis asp.net-mvc forms-authentication

263
推荐指数
12
解决办法
34万
查看次数

FormsAuthentication.SignOut()不会将用户注销

对此我砸了太久了.如何防止用户在使用FormsAuthentication.SignOut注销后浏览网站的页面?我希望这样做:

FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.如果我直接输入URL,我仍然可以浏览到该页面.我有一段时间没有使用自己的安全性,所以我忘记了为什么这不起作用.

asp.net forms-authentication

139
推荐指数
8
解决办法
13万
查看次数

如何重定向到ASP.NET MVC中的动态登录URL

我正在创建一个多租户网站,为客户端托管页面.URL的第一部分将是一个字符串,用于标识客户端,使用以下URL路由方案在Global.asax中定义:

"{client}/{controller}/{action}/{id}"
Run Code Online (Sandbox Code Playgroud)

这样工作正常,使用/ foo/Home/Index等URL.

但是,当使用[Authorize]属性时,我想重定向到也使用相同映射方案的登录页面.因此,如果客户端是foo,则登录页面将是/ foo/Account/Login,而不是web.config中定义的固定/帐户/登录重定向.

MVC使用HttpUnauthorizedResult返回401未授权状态,我认为这会导致ASP.NET重定向到web.config中定义的页面.

那么有谁知道如何覆盖ASP.NET登录重定向行为?或者通过创建自定义授权属性来重定向MVC会更好吗?

编辑 - 答:在深入研究.Net源代码后,我认为自定义身份验证属性是最佳解决方案:

public class ClientAuthorizeAttribute: AuthorizeAttribute
{
    public override void OnAuthorization( AuthorizationContext filterContext )
    {
        base.OnAuthorization( filterContext );

        if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "client", filterContext.RouteData.Values[ "client" ] },
                    { "controller", "Account" },
                    { "action", "Login" },
                    { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.net authentication asp.net-mvc forms-authentication asp.net-routing

95
推荐指数
2
解决办法
4万
查看次数

如何检查用户是"登录"?

我在ASP.NET应用程序中使用下面的方法进行表单身份验证

FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true);
Run Code Online (Sandbox Code Playgroud)

如何检查用户是否已登录?如何获取登录用户的用户名?

c# asp.net forms-authentication

84
推荐指数
4
解决办法
12万
查看次数

什么是ASPXAUTH cookie?

在使用ASP.Net Forms身份验证时,我遇到了.ASPXAUTH cookie.我有几个问题:

  • 这个cookie的目的是什么?
  • 这个cookie的位置是什么?

asp.net cookies forms-authentication

73
推荐指数
2
解决办法
6万
查看次数

为什么<deny users ="?" />包含在以下示例中?

?通配符表示未经授权的用户,同时*代表了所有用户,认证和未.我的书显示了以下URL授权示例:

<authorization>
  <deny users="?" />
  <allow users="dan,matthew" />
  <deny users="*" />
</authorization>
Run Code Online (Sandbox Code Playgroud)


但是上面的代码不具有与以下相同的效果:

<authorization>
  <allow users="dan,matthew" />
  <deny users="*" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

或者作者是否还包括 <deny users="?" />规则?

asp.net authentication authorization forms-authentication asp.net-membership

71
推荐指数
2
解决办法
13万
查看次数

表单身份验证:禁用重定向到登录页面

我有一个使用ASP.NET Forms身份验证的应用程序.在大多数情况下,它工作得很好,但我试图通过.ashx文件添加对简单API的支持.我希望ashx文件具有可选的身份验证(即,如果您不提供身份验证标头,那么它只是匿名工作).但是,根据您的操作,我希望在某些条件下要求身份验证.

如果没有提供所需的身份验证,我认为用状态代码401进行响应将是一件简单的事情,但似乎Forms Authentcation模块正在拦截它并通过重定向到登录页面进行响应.我的意思是,如果我的ProcessRequest方法看起来像这样:

public void ProcessRequest(HttpContext context)
{
    Response.StatusCode = 401;
    Response.StatusDescription = "Authentication required";
}
Run Code Online (Sandbox Code Playgroud)

然后,而不是像我期望的那样在客户端上获得401错误代码,我实际上正在获得302重定向到登录页面.

对于nornal HTTP流量,我可以看到它是如何有用的,但是对于我的API页面,我希望401经过不加修改,以便客户端调用者可以以编程方式响应它.

有没有办法做到这一点?

asp.net forms-authentication

69
推荐指数
6
解决办法
4万
查看次数

配置Spring Security 3.x以具有多个入口点

我一直在使用Spring Security 3.x来处理我的项目的用户身份验证,到目前为止,它已经完美运行.

我最近收到了一个新项目的要求.在此项目中,它需要两组用户身份验证:一组用于根据LDAP对员工进行身份验证,另一组用于根据数据库对客户进行身份验证.我对如何在Spring Security中配置它感到有点困惑.

我最初的想法是创建一个具有以下字段的登录屏幕: -

  • 单选按钮字段 - 供用户选择是员工还是客户.
  • j_username 用户字段.
  • j_password 密码字段.

如果用户选择"employee",那么我希望Spring Security针对LDAP对其进行身份验证,否则将根据数据库对凭据进行身份验证.但是,问题是表单将被提交,/j_spring_security_check并且我无法将单选按钮字段发送到我实现的自定义身份验证提供程序.我最初的想法是,我可能需要两个表单提交URL,而不是依赖于默认值/j_spring_security_check.每个URL都将由不同的身份验证提供程序处理,但我不确定如何在Spring Security中配置它.

我知道在Spring Security中,我可以配置后备身份验证,例如,如果LDAP身份验证失败,那么它将回退到数据库身份验证,但这不是我在这个新项目中拍摄的内容.

有人可以分享我应该如何在Spring Security 3.x中配置它?

谢谢.


更新 - 01-28-2011 - @ EasyAngel的技术

我正在尝试执行以下操作: -

  • 员工表单登录提交 /j_spring_security_check_for_employee
  • 客户表单登录提交 /j_spring_security_check_for_customer

我想要2种不同的表单登录的原因是允许我根据用户不同地处理身份验证,而不是进行后备身份验证.在我的情况下,员工和客户可能拥有相同的用户ID.

我合并了@ EasyAngel的想法,但必须更换一些已弃用的类.我目前面临的问题是没有过滤进程URLS似乎在Spring Security中注册,因为我不断获取Error 404: SRVE0190E: File not found: /j_spring_security_check_for_employee.我的直觉是springSecurityFilterChainbean没有正确连接,因此根本不使用我的自定义过滤器.

顺便说一下,我正在使用WebSphere,我确实com.ibm.ws.webcontainer.invokefilterscompatibility=true在服务器中设置了属性.我可以/j_spring_security_check毫无问题地达到默认值.

这是我完整的安全配置: -

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

    <sec:http auto-config="true">
        <sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/welcome.jsp"
            always-use-default-target="true" />
        <sec:logout …
Run Code Online (Sandbox Code Playgroud)

java authentication spring forms-authentication spring-security

64
推荐指数
2
解决办法
6万
查看次数

如何在SimpleMembership和WebSecurity中使用自己的数据库?什么是MVC4安全性?

我已经阅读了我能找到的关于这个主题的所有内容,包括MSDN文章和SO帖子,但我仍然非常迷茫和困惑.

问题

请回答以下内容(如果可能,请简要回答):

  1. 什么是SimpleMembership/SimpleMembershipProvider(WebMatrix.WebData)以及它们负责的是什么?

  2. 什么是WebSecurity(WebMatrix.WebData)?

  3. 什么是Membership(System.Web.Security)类?

  4. 为什么MVC4会创建一个UserProfile表和一个webpages_Membership表?它们是什么,有什么区别?MVC4创建的UserProfile类是什么?

  5. 什么是UsersContext类?

  6. 所有这些如何协同工作以进行用户身份验证?

我的情况

这些问题然后导致下一个问题:

假设我有一个包含用户的现有数据库(ID,用户名,密码).我正在创建一个新的MVC4应用程序并使用表单身份验证.用户密码以加密形式(不是bcrypt)存储在数据库中.

我需要做些什么才能使它与MVC4一起使用?

我是否必须创建自定义MembershipProvider

我的知识远远不够

据我所知,WebSecurity是一个静态类(Module),它与MembershipProvider交互.MembershipProvider是一个解释特定函数如何工作的类,例如ValidateUser,CreateUser,ChangePassword.

为了解决我的问题,我假设我需要创建一个自定义MembershipProvider并告诉WebSecurity使用我的新MembershipProvider.

赏金?

我已经在这个问题上获得了赏金,并打算将其授予安迪·布朗,以获得出色的答案.

forms-authentication asp.net-membership membership-provider asp.net-mvc-4 simplemembership

61
推荐指数
1
解决办法
3万
查看次数