Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨域身份验证的最佳实践_C#_Asp.net Mvc_Cordova_Security - Fatal编程技术网

C# 跨域身份验证的最佳实践

C# 跨域身份验证的最佳实践,c#,asp.net-mvc,cordova,security,C#,Asp.net Mvc,Cordova,Security,我有一个现有的web应用程序,正在将其移植到PhoneGap。我已经成功地复制了这一点,但我想知道跨域身份验证的最佳实践。我应该在这里提到,现有的身份验证使用的是System.Web.Security,我的PhoneGap应用程序正在与之通信的Web服务具有相同的性质 目前,我已经设置了登录功能,它将发布到我的登录方法: [HttpPost] public JsonResult Login(LoginModel viewModel) { string error = ""; if

我有一个现有的web应用程序,正在将其移植到
PhoneGap
。我已经成功地复制了这一点,但我想知道跨域身份验证的最佳实践。我应该在这里提到,现有的身份验证使用的是
System.Web.Security
,我的PhoneGap应用程序正在与之通信的Web服务具有相同的性质

目前,我已经设置了
登录
功能,它将发布到我的登录方法:

[HttpPost]
public JsonResult Login(LoginModel viewModel)
{
    string error = "";
    if (!WebSecurity.IsAccountLockedOut(viewModel.UserName, 3, 60 * 60))
    {
        if (WebSecurity.Login(viewModel.UserName, viewModel.Password))
            return Json(new { success = true });
        error = "The user name or password provided is incorrect.";
    }
    else
        error = "Too many failed login attempts. Please try again later.";

    return Json(new { success = false, error });
}
这是从我的
Javascript

function login(data, automated) {
    $.ajax({
        type: "POST",
        url: "http://url/checkin/app/login",
        content: "application/json; charset=utf-8",
        dataType: "json",
        data: data,
        success: function(d) {
            if (d.success == true) {
                window.localStorage.setItem('UserName', data.UserName);
                window.localStorage.setItem('Password', data.Password);
                window.location = "index.html";
            } else {
                localStorage.clear();

                if (!automated) {
                    app.showError(d.error);
                }
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            app.showError(errorThrown);
        }
    });
}
我希望它能正常工作,如果凭据正确,它会返回
success:true
。转到与服务的其他交互,这就是我感到困惑的地方。我不希望
Membership.GetUser()
工作:

[HttpPost]
public JsonResult CheckIn(int id)
{
    var user = Membership.GetUser();

    // Do stuff
}
这是怎么回事?更重要的是它安全吗?我是否应该以不同的方式处理此问题?

当我登录到该站点的桌面版本(原始版本)时,我的cookie中有一个
.ASPXAUTH
值,而我的PhoneGap应用程序则不是这样。这就是为什么我对它的工作原理感到困惑

我的控制器上有一个
属性
,当该属性被删除时,将阻止应用程序登录。但是,我不确定这是否是允许跨域身份验证的原因

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }

    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
            }
        }
    }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple=false,Inherited=true)]
公共密封类InitializeSimpleMembershipAttribute:ActionFilterAttribute
{
私有静态SimpleMembershipInitializer\u initializer;
私有静态对象_initializerLock=新对象();
私有静态布尔值初始化;
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
//确保每次应用程序启动仅初始化一次ASP.NET简单成员身份
LazyInitializer.确保重新初始化(参考初始值设定项,参考初始值设定项,参考初始值设定项锁定);
}
私有类SimpleMembershipInitializer
{
公共SimpleMembershipInitializer()
{
Database.SetInitializer(null);
尝试
{
使用(var context=new UsersContext())
{
如果(!context.Database.Exists())
{
//创建没有实体框架迁移模式的SimpleMembership数据库
((IObjectContextAdapter)context.ObjectContext.CreateDatabase();
}
}
WebSecurity.InitializeDatabaseConnection(“DefaultConnection”、“UserProfile”、“UserId”、“UserName”,autoCreateTables:true);
}
捕获(例外情况除外)
{
抛出新的InvalidOperationException(“无法初始化ASP.NET简单成员身份数据库。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=256588“,ex);
}
}
}
}

“我不希望Membership.GetUser()工作”-为什么不?@CodeCaster我只是不希望它能够验证来自另一个网络的呼叫。我对这方面的安全性很幼稚,所以这只是一个假设。这在很大程度上取决于控制器和应用程序身份验证的设置以及客户端应用程序的登录方式。从显示的代码中无法判断这是否可行。@CodeMaster具体来说,需要显示什么?我在任何地方都看不到跨域身份验证。对同一域的不同的、经过身份验证的调用不是跨域身份验证,后者更多地与使用单个身份验证令牌(想想OpenID)的不同域有关。我想您的客户端应用程序是使用基本身份验证登录的吧?然后,在向您的服务发送每个请求时,客户端都会传递凭据。